现在的位置: 首页 > 综合 > 正文

oracle11g的result cache小结(一)

2013年11月17日 ⁄ 综合 ⁄ 共 6017字 ⁄ 字号 评论关闭

author:skate
time:2011/09/28

 

oracle11g的result cache小结(一)

 

11G result cache缓存结果集的新特性,是一个非常适合只读、读>>写、典型OLTP等系统的功能。oracle的result cache
分为client query cache result和server query cache result

 

SQL> show parameter result
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_lag              big integer 3000
client_result_cache_size             big integer 0
result_cache_max_result              integer     5
result_cache_max_size                big integer 85024K
result_cache_mode                    string      FORCE
result_cache_remote_expiration       integer     0
 
SQL>

关于Server Result Cache的几个重要参数

result_cache_mode:
该参数是最为重要的,其属性有manual和force,auto三种。
manual是默认属性,也就是说我们要启用该特性,那么必须通过hint来实现,不然oracle的优化器是无法认知的,oracle关于result cache的
hint如下:

SQL> SELECT name,version FROM v$sql_hint WHERE name LIKE '%RESULT%';
 
NAME                                                             VERSION
---------------------------------------------------------------- -------------------------
RESULT_CACHE                                                     11.1.0.6
NO_RESULT_CACHE                                                  11.1.0.6

当设置为force时,oracle 优化就能自动识别了,不需要使用hint,相反,如果当设置为force时,同时
你又不想某个sql或应用使用该特性,那么可以使用NO_RESUIT_CACHE  hint来进行避规。

当设置了auto时,优化器将根据大量因素决定是否缓存结果。决定因素包括查询执行的频率、生成结果的
成本以及针对底层数据库对象更改的频率,目前的稳定性还需要验证。

result_cache_max_size
该参数控制着使用该特性的内存大小,当该参数设置为0,那么也就意味着关闭了该特性。
该部分内存是从SGA中分配的,Oracle11g都不会将RESULT_CACHE_MAX_SIZE设置为超过
SHARED_POOL_SIZE的75%,至于分配的比例关系,metalink提供了如下的数据:
0.25% of MEMORY_TARGET or
0.5% of SGA_TARGET or
1% of SHARED_POOL_SIZE

result_cache_max_result
该参数是控制单个result所能占据query cache的大小比例,注意是一个百分比。
该参数默认是是5%,取值范围当然是1% ~ 100% 了。

result_cache_remote_expiration
该参数的作用是根据远程数据库对象设置缓存过期的时间,默认值为0.
也就是说,默认情况下,远程数据库对象不会被进行cache的。

_result_cache_global
顾名思义,该参数肯定是针对Rac集群而设计的,这样可以大大的降低经典的gc等待。

和Result Cache相关的视图
SQL> select * from dict where table_name like '%RESULT_CACHE%';
 
TABLE_NAME                     COMMENTS
------------------------------ --------------------------------------------------------------------------------
CLIENT_RESULT_CACHE_STATS$     Synonym for CRCSTATS_$
GV$RESULT_CACHE_DEPENDENCY     Synonym for GV_$RESULT_CACHE_DEPENDENCY
GV$RESULT_CACHE_MEMORY         Synonym for GV_$RESULT_CACHE_MEMORY
GV$RESULT_CACHE_OBJECTS        Synonym for GV_$RESULT_CACHE_OBJECTS
GV$RESULT_CACHE_STATISTICS     Synonym for GV_$RESULT_CACHE_STATISTICS
V$RESULT_CACHE_DEPENDENCY      Synonym for V_$RESULT_CACHE_DEPENDENCY
V$RESULT_CACHE_MEMORY          Synonym for V_$RESULT_CACHE_MEMORY
V$RESULT_CACHE_OBJECTS         Synonym for V_$RESULT_CACHE_OBJECTS
V$RESULT_CACHE_STATISTICS      Synonym for V_$RESULT_CACHE_STATISTICS
 
9 rows selected
 
SQL>

V$RESULT_CACHE_STATISTICS:列出各种缓存设置和内存使用统计数据。
这个特殊说明下字段:
Create Count Success:新建的result cache的数量
Find Count:说明使用result cache的次数
Create Count Failure:说明创建result cache失败的数量

V$RESULT_CACHE_MEMORY:列出所有的内存块和相应的统计信息。
V$RESULT_CACHE_OBJECTS:列出所有的对象(缓存的结果和依赖的对象)和它们的属性。
V$RESULT_CACHE_DEPENDENCY:列出缓存的结果和依赖对象间的依赖详情。

oracle还提供了一个包来管理server result cache:dbms_result_cache

SQL> desc dbms_result_cache

Element           Type     
----------------- ---------
STATUS_DISA       CONSTANT 
STATUS_ENAB       CONSTANT 
STATUS_BYPS       CONSTANT 
STATUS_SYNC       CONSTANT 
STATUS_CORR       CONSTANT 
STATUS            FUNCTION 
FLUSH             FUNCTION 
MEMORY_REPORT     PROCEDURE
DELETE_DEPENDENCY FUNCTION 
INVALIDATE        FUNCTION 
INVALIDATE_OBJECT FUNCTION 
BYPASS            PROCEDURE
 
SQL>

查看server result cache的内存使用报告

SQL> set serveroutput on;
SQL> exec dbms_result_cache.Memory_Report
 
R e s u l t   C a c h e   M e m o r y   R e p o r t
[Parameters]
Block Size          = 1K bytes
Maximum Cache Size  = 85024K bytes (85024 blocks)
Maximum Result Size = 4251K bytes (4251 blocks)
[Memory]
Total Memory = 87426840 bytes [5.428% of the Shared Pool]
 
... Fixed Memory = 68992 bytes [0.004% of the Shared Pool]
... Dynamic Memory = 87357848 bytes [5.424% of the Shared Pool]
....... Overhead = 293272 bytes
....... Cache Memory = 85024K bytes (85024 blocks)
........... Unused Memory = 0 blocks
........... Used Memory = 85024 blocks
............... Dependencies = 89 blocks (89 count)
............... Results = 84935 blocks
................... SQL     = 59063 blocks (46593 count)
................... Invalid = 25546 blocks (23785 count)
 
PL/SQL procedure successfully completed
 
SQL>

DBMS_RESULT_CACHE功能和存储过程

STATUS存储过程
  返回结果缓存的当前状态。值包括:
ENABLED:结果缓存是激活的。
DISABLED:结果缓存是不可用的。
BYPASSED:结果缓存暂时不可用。
SYNC: 结果缓存是可用的,但是目前正与其他RAC节点重新同步。
 
MEMORY_REPORT存储过程
 列出结果缓存内存利用的一个概要(默认)或详细的报表。
 
FLUSH存储过程
 推出整个结果缓存的内容。
 
INVALIDATE存储过程
 使结果缓存中一个特定对象的缓存结果无效。
 
INVALIDATE_OBJECT存储过程
 根据缓存ID使一特定结果缓存无效。
 

深入认识result cache

query cache result特性所占据的内存是从sga的share pool中分配,如下视图可以看到

SQL>  select * from v$sgastat  where lower(name) like '%result%';
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  Result Cache: State Objs        66536
shared pool  Result Cache                 87357848
shared pool  Result Cache: Memory Mgr          200
shared pool  Result Cache: Cache Mgr           208
shared pool  Result Cache: Bloom Fltr         2048
 
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,如下所示

SQL>  select * from v$latchname where name like 'Result Cache%'
  2  ;
 
    LATCH# NAME                                                                   HASH
---------- ---------------------------------------------------------------- ----------
       405 Result Cache: RC Latch                                           1054203712
       406 Result Cache: SO Latch                                            986859868
       407 Result Cache: MB Latch                                            995186388
 

检查result cache配置是否生效
1.select dbms_result_cache.status from dual;
2.dbms_result_cache.MEMORY_REPORT
3.查看sql执行计划

注意:
11g的active dataguard的备库是不能使用result cache的,这是oracle的一个bug,因为涉及到内码的问题,所以oracle一直没有修复,result cache目前可以使用在单节点主库和rac环境。

 

参考文档:
http://www.oracle-developer.net/display.php?id=503
http://space.itpub.net/15415488/viewspace-615873
http://www.killdb.com/2011/08/20/11g-%e6%96%b0%e7%89%b9%e6%80%a7%e4%b9%8b-query-result-cache3.html

 

 

 

 

---------end---------

 

 

 

抱歉!评论已关闭.