ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 聊聊Oracle 11g的Result Cache(三)

聊聊Oracle 11g的Result Cache(三)

Linux操作系统 作者:startay 时间:2016-06-22 17:25:47 0 删除 编辑

下面我们来介绍一下Result Cache特性对应的参数、视图和工具包。

 

6Result 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对应的取值是FORCEFORCE的含义是说,无论何时,都会对所有SQL启用Result Cache功能,除非SQL中显示出现了NO_RESULT_CACHEhint标记。

 

明显的,result_cache对所有SQL开启是一个不合理的设计。所以,我们通常只要开启默认值MANUAL就好了。

 

 

7Result 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

 

 

8DBMS_RESULT_CACHE工具包

 

 

Oracle为了提供result cache的管理,提供了dbms_result_cache工具包,其中的一些方法,可以帮助我们解决实际中的很多cache问题。

 

 

SQL> select dbms_result_cache.Status from dual;

 

STATUS

--------------------------------------------------------------------------------

ENABLED

 

 

诸多功能中,感觉清理cachereport 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

---------- ---------- --------- -------------------- --------------------------------------------------------------------------------

 

 

9Result 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对象的nextvalcurval,或者sysdate这类的函数,就不能使用result cache

 

下面我们具体介绍一下Result Cache的应用场景。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17086096/viewspace-2120732/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-07-29

  • 博文量
    45
  • 访问量
    87438