下面我们来介绍一下Result Cache特性对应的参数、视图和工具包。
6、Result Cache模式
在诸多的Result Cache相关参数中,Result Cache Mode是一个重要的开关参数。这个参数控制着当前Oracle是否使用客户端和服务器端Result Cache功能。
在之前的文章中,我们讨论了Result Cache的特性。其中最大引起我们关注的就是Cache对象失效机制,只要查询“依赖”的基础数据表发生了变化,包括表结构、数据和授权关系,Cache缓存对象就会失效。频繁的Cache构建和失效、再次构建失效,要消耗很多CPU和内存空间。所以,从Oracle的角度看:应用程序SQL查询主要对于只读(Read-Only)对象或者变化较小(Read-Mostly)的数据库对象。
初始化参数RESULT_CACHE_MODE用来控制Result Cache功能的开启工作模式,默认是MANUAL。
SQL> show parameter result_cache_mode;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
result_cache_mode string MANUAL
MANUAL表示SQL语句只有在显示的使用hint RESULT_CACHE的情况下,才会启用Cache功能。与MANUAL对应的取值是FORCE,FORCE的含义是说,无论何时,都会对所有SQL启用Result Cache功能,除非SQL中显示出现了NO_RESULT_CACHE的hint标记。
明显的,result_cache对所有SQL开启是一个不合理的设计。所以,我们通常只要开启默认值MANUAL就好了。
7、Result Cache相关视图
Result Cache功能对应了一些视图对象,用来辅助观察Cache中的对象和信息。
SQL> select * from dictionary where table_name like '%RESULT_CACHE%';
TABLE_NAME COMMENTS
------------------------------ --------------------------------------------------------------------------------
CLIENT_RESULT_CACHE_STATS$ Synonym for CRCSTATS_$
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
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
9 rows selected
视图v$result_cache_objects可以查看当前result cache中存在的对象信息。
SQL> select id, type, status, name, cache_id from v$result_cache_objects;
ID TYPE STATUS NAME CACHE_ID
---------- ---------- --------- -------------------- --------------------------------------------------------------------------------
0 Dependency Published SCOTT.EMP SCOTT.EMP
1 Result Published select /*+result_cac 9xxbaav9pzwwx8c8muup7p5h5a
he*/* from emp
Oracle为每一个真正存在的Result Cache分配一个Cache ID编号。通过视图v$result_cache_objects可以监控当前的对象状态、信息以及依赖关系。
V$result_cache_dependency是描述缓存数据集合和依赖对象关系的视图。Result Cache中,一个很大的问题就是如何让缓存及时反馈数据的变化。Oracle采用了对象依赖的机制,一旦对象发生了变化,依赖他的Cache就失效不可用。
SQL> select * from v$result_cache_dependency;
RESULT_ID DEPEND_ID OBJECT_NO
---------- ---------- ----------
1 0 75335
借助v$result_cache_dependency视图,我们可以看到对象之间的依赖关系,其中的ID是缓存中的ID编号。
在内存SGA中,Oracle分配对象都是以Chunk为单位进行的。视图v$result_cache_memory从内存分配角度,看对象信息缓存的情况。
SQL> select * from v$result_cache_memory;
ID CHUNK OFFSET FREE OBJECT_ID POSITION
---------- ---------- ---------- ---- ---------- ----------
0 0 0 NO 0 0
1 0 1 NO 1 0
2 0 2 YES
3 0 3 YES
4 0 4 YES
5 0 5 YES
(篇幅原因,有省略......)
最后是v$result_cache_statistics,计算统计了数据汇总信息。
SQL> select * from v$result_cache_statistics;
ID NAME VALUE
---------- -------------------- ----------
1 Block Size (Bytes) 1024
2 Block Count Maximum 15744
3 Block Count Current 32
4 Result Size Maximum 787
(Blocks)
5 Create Count Success 1
6 Create Count Failure 0
7 Find Count 0
8 Invalidation Count 0
9 Delete Count Invalid 0
10 Delete Count Valid 0
11 Hash Chain Length 1
12 Find Copy Count 0
12 rows selected
8、DBMS_RESULT_CACHE工具包
Oracle为了提供result cache的管理,提供了dbms_result_cache工具包,其中的一些方法,可以帮助我们解决实际中的很多cache问题。
SQL> select dbms_result_cache.Status from dual;
STATUS
--------------------------------------------------------------------------------
ENABLED
诸多功能中,感觉清理cache和report cache信息比较有用。
SQL> set serveroutput on size 10000;
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 = 15744K bytes (15744 blocks)
Maximum Result Size = 787K bytes (787 blocks)
[Memory]
Total Memory = 151976 bytes [0.010% of the Shared Pool]
... Fixed Memory = 5352 bytes [0.000% of the Shared Pool]
... Dynamic Memory = 146624 bytes [0.009% of the Shared Pool]
....... verhead = 113856 bytes
....... Cache Memory = 32K bytes (32 blocks)
........... Unused Memory = 30 blocks
........... Used Memory = 2 blocks
............... Dependencies = 1 blocks (1 count)
............... Results = 1 blocks
................... SQL = 1 blocks (1 count)
PL/SQL procedure successfully completed
Memory Cache报告内容比较详细,也比较清晰。
SQL> exec dbms_result_cache.Flush;
PL/SQL procedure successfully completed
SQL> select id, type, status, name, cache_id from v$result_cache_objects;
ID TYPE STATUS NAME CACHE_ID
---------- ---------- --------- -------------------- --------------------------------------------------------------------------------
9、Result Cache的一些限制
最后,我们说一下Result Cache的一些限制内容。
首先,临时表和SYS/SYSTEM用户下的数据表是不支持result cache的。
SQL> show user;
User is "SYS"
SQL> select /*+result_cache*/count(*) from t;
COUNT(*)
----------
83209
SQL> select id, type, status, name, cache_id from v$result_cache_objects;
ID TYPE STATUS NAME CACHE_ID
---------- ---------- --------- -------------------- --------------------------------------------------------------------------------
SQL> select /*+result_cache*/count(*) from scott.dept;
COUNT(*)
----------
4
SQL> select id, type, status, name, cache_id from v$result_cache_objects;
ID TYPE STATUS NAME CACHE_ID
---------- ---------- --------- -------------------- --------------------------------------------------------------------------------
0 Dependency Published SCOTT.DEPT SCOTT.DEPT
1 Result Published select /*+result_cac ahagshfx7u1wn348sd166sux6f
he*/count(*) from sc
ott.dept
非sys/system对象的数据表才能使用result cache特性。
其次,就是SQL语句中不能包括非确定性的语句和非确定性函数。比如,如果包括sequence对象的nextval和curval,或者sysdate这类的函数,就不能使用result cache。
下面我们具体介绍一下Result Cache的应用场景。