关于oracle result cache 结果集缓存的使用说明总结
2014-09-09 15:02
537 查看
oracle result cache 结果集缓存的使用说明总结
一、Result Set Caching 说明
1、概述:Oracle 从11g开始引入了结果集缓存(result cache)的新特性,用于存储经常使用的SQL语句和函数的查询结果,将来语句再执行的时候,oracle直接的访问内存得到结果2、优点:重用相同的结果集,减少逻辑IO,提高系统性能
3、分类:oracle数据库引擎提供了三种结果集缓存,包括:服务器查询结果集缓存、pl/sql函数结果集缓存和客户端结果集缓存
4、应用场合:访问多行返回少数行的语句,非常适合只读、读>>写、典型OLTP等系统的功能;ORACLE建议应用仅仅对read only的表中使用result cache缓存功能
5、影响因素:在SGA中缓存sql语句的执行结果,相同sql再次执行时,直接从SGA直接读结果就可以了,不需要在去数据库中扫描索引,或是回表,计算之类的,
若sql中对应的对象(比如表)做了update,insert,delete或是ddl操作,相关所有sql的缓存结果集就自动失效了,重新刷新结果集缓存
result cache也有类似enqueue/lock的保护机制,RC enqueue就是拿来保护并发修改的。result cache他依赖是object level的,
既不是row level的,也不是block level的。任何DML/DDL(甚至包括grant)都会使基于这个object的result cache变为invalidate。
所以result cache只有对那些在平时几乎没有任何DML的只读表比较有用,可以减轻io的压力。
在平时读取阶段不是使用的shared pool latch,而是使用的result cache latch
6、使用限制:
(1)查询使用非确定性的函数,序列和临时表的结果集不会被缓存
(2)查询违反了读一致性时结果集将不会被缓存
(3)引用数据字典视图的查询的结果集不会被缓存
(4)查询结果集大于可用缓存结果集可用空间的不被缓存;采用LRU算法来管理result cache。
二、服务器端结果集缓存
1、 相关参数说明影响result cache开启使用的两个参数:result_cache_mode和result_cache_max_size
RESULT_CACHE_MODE
参数有三个值:AUTO、MANUAL 和FORCE
(1) 设置为AUTO 时,优化程序将根据重复的执行操作确定将哪些结果存储在高速缓存中。
(2) 设置为MANUAL(默认值)时,必须使用RESULT_CACHE (v$sql_hint视图查看hint信息) 提示指定在高速缓存中存储特定结果。
(3) 设置为FORCE 时,所有结果都将存储在高速缓存中。
注:对于AUTO 和FORCE 设置,如果语句中包含[NO_]RESULT_CACHE 提示,则该提示优先于参数设置。
RESULT_CACHE_MAX_SIZE
参数设置分配给结果高速缓存的内存,如果将其值设为0,则会禁用结果高速缓存
默认值取决于其它三个内存参数设置(memory_target的0.25% 或sga_target 的0.5% 或shared_pool_size 的1%),其值为32K的整数倍;
官档提示:Oracle Database will not allocate more than 75% of the shared pool to the server result cache
实验结果:最大值不会大于三个内存参数设置的80%(按shared_pool_size、sga_target、memory_target依次优先检查设置的值)。
即:当三个都设置了时,以shared_pool_size为准;shared_pool_size没设置时,以sga_target为准;只有memory_target设置时,以memory_target为准。
注意:无论默认取值还是最大取值,约定为大于等于指定值的最小32K倍数值;如当shared_pool_size=100K时,则80%为80K,80K不是32K整数倍,大于80K的32K倍数值最小值为96K;
重置shared_pool_size或shared_pool_size为0时,并不认为没有设置,此时RESULT_CACHE_MAX_SIZE始终为0(由于最大值是0的80%的缘故);当修改过这三个值0时,要恢复不设置
状态,可以生成pfile,从pfile中删除对应参数记录
计算公式参数值换算成KB单位:
--默认值
shared_pool_size(GB):SELECT CEIL(shared_pool_size * 0.01 / 32) * 32||'K' AS "RESULT_CACHE_MAX_SIZE" FROM dual;
sga_target(GB):SELECT CEIL(sga_target * 0.01 * 0.5 / 32) * 32||'K' AS "RESULT_CACHE_MAX_SIZE" FROM dual;
memory_target(GB):SELECT CEIL(memory_target * 0.01 * 0.25 / 32) * 32||'K' AS "RESULT_CACHE_MAX_SIZE" FROM dual;
--最大值
SELECT 'result_cache_max_size' as "NAME", CEIL(para_size * 0.8 / 32) * 32 / 1024 ||'K' AS "DISPLAY_VALUE" FROM dual;
新装数据库根据选择ASSM还是AMM觉定(memory_target和shared_pool_size有一值为0,一值为非0值)。
例如:
--选择ASMM
col name for a30
col display_value for a30
select name,display_value from v$parameter where name in ('memory_target','shared_pool_size','sga_target', 'result_cache_max_size');
NAME DISPLAY_VALUE
------------------------------ ------------------------------
shared_pool_size 0
sga_target 3G
memory_target 0
result_cache_max_size 15744K
col name for a30
col display_value for a30
SELECT 'result_cache_max_size' as "NAME", CEIL(3 * 1024 * 1024 * 0.01 * 0.5 / 32) * 32||'K' AS "DISPLAY_VALUE" FROM dual;
NAME DISPLAY_VALUE
------------------------------ ------------------------------
result_cache_max_size 15744K
--选择AMM
col name for a30
col display_value for a30
select name,display_value from v$parameter where name in ('memory_target','shared_pool_size','sga_target', 'result_cache_max_size');
NAME DISPLAY_VALUE
------------------------------ ------------------------------
shared_pool_size 0
sga_target 0
memory_target 4G
result_cache_max_size 10496K
col name for a30
col display_value for a30
SELECT 'result_cache_max_size' as "NAME", CEIL(4 * 1024 * 1024 * 0.01 * 0.25 / 32) * 32||'K' AS "DISPLAY_VALUE" FROM dual;
NAME DISPLAY_VALUE
------------------------------ ------------------------------
result_cache_max_size 10496K
--选择MSMM
col name for a30
col display_value for a30
select name,display_value from v$parameter where name in ('memory_target','shared_pool_size','sga_target', 'result_cache_max_size');
NAME DISPLAY_VALUE
------------------------------ ------------------------------
shared_pool_size 480M
sga_target
4000
0
memory_target 0
result_cache_max_size 4928K
col name for a30
col display_value for a30
SELECT 'result_cache_max_size' as "NAME", CEIL(480 * 1024 * 0.01 / 32) * 32||'K' AS "DISPLAY_VALUE" FROM dual;
NAME DISPLAY_VALUE
------------------------------ ------------------------------
result_cache_max_size 4928K
SQL> ALTER SYSTEM SET result_cache_max_size=1g;
System altered.
SQL> select name,display_value from v$parameter where name in ('memory_target','shared_pool_size','sga_target', 'result_cache_max_size');
NAME DISPLAY_VALUE
------------------------------ ------------------------------
shared_pool_size 480M
sga_target 0
memory_target 0
result_cache_max_size 384M
SQL> select 384/480 from dual;
384/480
----------
.8
小结:由上可知,RESULT_CACHE_MAX_SIZE三种默认取值恰好对应的是数据库内存的三种管理模式(AMM、ASMM和MSMM);手动设置时,最大值为shared_pool_size的80%
RESULT_CACHE_MAX_RESULT
限制单个result所能占据query cache的最大百分比大小;默认是5%
RESULT_CACHE_REMOTE_EXPIRATION
设置远程数据库结果集缓存过期的时间,以分钟为单位,默认值为0不缓存远程数据库结果集
2、相关视图说明
V$RESULT_CACHE_STATISTICS:列出各种缓存设置和内存使用统计数据。
V$RESULT_CACHE_MEMORY:列出所有的内存块和相应的统计信息。
V$RESULT_CACHE_OBJECTS:列出所有的对象(缓存的结果和依赖的对象)和它们的属性。
V$RESULT_CACHE_DEPENDENCY:列出缓存的结果和依赖对象间的依赖详情。
3、相关的包:DBMS_RESULT_CACHE
3.1 STATUS存储过程
--DISABLED:表示没有开启
--ENABLE :表示已经开启了,并且可以使用结果集缓存
--BYPASS :表是已经开启了,但不可以使用结果集缓存(跳过了),此时可以通过执行 exec dbms_result_cache.bypass(FALSE);
-----------如果仍然是bypass则可能是参数result_cache_max_size 的值为0的原因
--SYNC :结果缓存是可用的,但是目前正与其他RAC节点重新同步。
3.2 MEMORY_REPORT存储过程 :列出结果缓存内存利用的一个概要(默认)或详细的报表。
3.3 FLUSH存储过程 :清空整个结果缓存的内容。
3.4 INVALIDATE存储过程 :使结果缓存中一个特定对象的缓存结果无效。
3.5 INVALIDATE_OBJECT存储过程:根据缓存ID使一特定结果缓存无效。
注意: 11g的active dataguard的备库是不能使用result cache的,这是oracle的一个bug,因为涉及到内码的问题,所以oracle一直没有修复,
result cache目前可以使用在单节点主库和rac环境。
开启result cache
1、设置RESULT_CACHE_MODE为FORCE
2、根据内存管理方式调整相关参数,设置RESULT_CACHE_MAX_SIZE大小
3、检查result cache是否开启:select dbms_result_cache.status from dual;
关于设置result cache遇到的问题:
场景: 安装库时选择的是ASMM模式,后来ASMM调整成了AMM,设置sga_target=0;导致设置result_cache_max_size时始终为0设置不了其他值
原因: ASMM时,result_cache_max_size以sga_target参数为参考值,当设置sga_target=0时,由于sga_target还存在于spfile中;使得result_cache_max_size仍以sga_target参数为参考值,
由最大值限制,result_cache_max_size时始终为0
解决: 执行alter system reset sga_target;重启库设置result_cache_max_size值;这样使得sga_target从spfile中删除;从而result_cache_max_size以memory_target参数为参考值
扩展:result_cache_max_size从spfile中shared_pool_size、sga_target和memory_target依次查找选择参考值
查找参数是否在spfile中(isspecified为TRUE表示指定在spfile中):
SELECT NAME, VALUE, display_value, isspecified
FROM v$spparameter
WHERE NAME IN ('memory_max_target',
'memory_target',
'sga_max_size',
'sga_target',
'shared_pool_size',
'result_cache_max_size')
ORDER BY NAME;
相关文章推荐
- PL/SQL (关于oracle学习总结的说明)
- Oracle 11g 的服务器结果缓存result_cache_mode
- Oracle 11g 新特性 -- Result Cache(结果高速缓存)说明
- 关于ORACLE的硬解析和软解析与MySQL的查询缓存query_cache探讨
- 【缓存】Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
- 关于Spring 如何使用@cacheable、@cacheEvict、@cacheput操作缓存
- GIS图片缓存工具GeoWebCache的使用说明
- 关于使用ASP.NET4.0 OutputCacheProvider做缓存注意的地方(缓存放入redis)
- 关于缓存中Cookie,Session,Cache的使用
- Oracle 11g 新特性 -- Result Cache(结果高速缓存)说明
- Oracle 11g 新特性 -- Result Cache(结果高速缓存)说明
- 关于oracle中LONG数据类型使用上的一些总结
- Oracle 11g 的server结果缓存result_cache_mode
- ORACLE关于bin目录下各文件的意义及使用方法
- 关于Adodb.Stream 的使用说明
- 关于Oracle中的rownum两个使用原则
- 关于Adodb.Stream 的使用说明
- 关于使用 session_start 出现的 Warning: session_start(): Cannot send sessioncache limiter - 问题的解决
- 关于Adodb.Stream的使用说明
- 关于在组件GIS开发中使用Python的一点补充说明