您的位置:首页 > 数据库 > Oracle

关于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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息