聊聊Oracle 11g的Result Cache(三)

startay發表於2016-06-22

下面我們來介紹一下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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章