在Oracle中,什麼是結果集緩存?數據庫
結果集緩存(Result Cache)是Oracle 11g的新特性,用於存儲常用的SQL語句和函數的查詢結果。當相同語句再次執行的時候,Oracle就不用再次重複執行(包括掃描索引、回表、計算、邏輯讀、物理讀等操做),而是直接訪問內存獲得結果。結果集緩存能夠將SQL語句查詢的結果緩存在內存(SGA的Shared Pool)中,從而顯著地改進須要屢次執行和查詢相同結果的SQL語句的性能。緩存
結果集緩存的優勢是能夠重用相同的結果集,減小邏輯I/O,從而提升系統性能。結果集緩存最適合的是靜態表(例如只讀表),即結果集緩存最適合返回一樣結果的查詢。若SQL語句中包含的對象(例如表)作了UPDATE,INSERT,DELETE或是DDL操做,則相關的全部SQL的緩存結果集就自動失效了。因此,Result Cache只對那些在平時幾乎沒有任何DML操做的只讀表比較有用,能夠減輕I/O的壓力。服務器
在實際狀況中,結果集緩存僅在少數的狀況下是有效的。在如下狀況中,結果集不會被緩存:ide
① 查詢使用非肯定性的函數、序列和臨時表的結果集不會被緩存。函數
② 查詢違反了讀一致性時結果集將不會被緩存。性能
③ 引用數據字典視圖的查詢的結果集不會被緩存。學習
④ 查詢結果集大於可用緩存結果集可用空間的不會被緩存。優化
⑤ 對依賴對象的任何改變(DML、DDL)都會使整個緩存的結果集變爲無效,結果集緩存最適合那些只讀或接近只讀的表。this
⑥ ADG的備庫不能使用結果集緩存。spa
Oracle數據庫引擎提供了3種結果集緩存,包括:服務器查詢結果集緩存、PL/SQL函數結果集緩存和客戶端結果集緩存。
(一)服務器查詢結果集緩存
服務器查詢結果集緩存由如下一些參數控制:
l RESULT_CACHE_MODE:該參數用來控制結果集緩存的操做模式。AUTO表示優化程序將根據重複的執行操做肯定將哪些結果存儲在高速緩存中。MANUAL表示只有使用了RESULT_CAHCE提示的查詢或對帶有RESULT_CACHE屬性的表訪問的查詢纔會被緩存,MANUAL爲該參數的默認值。FORCE表示全部合適的查詢都會被緩存。對於AUTO和FORCE設置,若是語句中包含[NO_]RESULT_CACHE提示,那麼該提示優先於參數設置。
l RESULT_CACHE_MAX_SIZE:控制結果集緩存的大小,默認值取決於其它內存設置(MEMORY_TARGET的0.25%或SGA_TARGET的0.5%或SHARED_POOL_SIZE的1%)。當RESULT_CACHE_MAX_SIZE爲0的時候,表明不啓用結果集緩存。須要注意的是,若將該參數的值從0修改成非0值後,則須要重啓數據庫才能啓用服務器查詢結果集緩存特性,反之亦然。
l RESULT_CACHE_MAX_RESULT:單個結果集可以消耗的緩存的最大百分比,比這個值大的結果集將不能被緩存,默認大小爲RESULT_CACHE_MAX_SIZE的5%。
l RESULT_CACHE_REMOTE_EXPIRATION:設置遠程數據庫結果集緩存過時的時間,以分鐘爲單位,默認值爲0,表示不緩存遠程數據庫結果集。
與結果集緩存相關的一些視圖:
l V$RESULT_CACHE_STATISTICS:列出各類緩存設置和內存使用統計數據。
l V$RESULT_CACHE_MEMORY:列出全部的內存塊和相應的統計信息。
l V$RESULT_CACHE_OBJECTS:列出全部的對象(緩存的結果和依賴的對象)和它們的屬性。
l V$RESULT_CACHE_DEPENDENCY:列出緩存的結果和依賴對象間的依賴詳情。
與結果集緩存相關的包是DBMS_RESULT_CACHE。
l STATUS函數:返回值若爲DISABLED則表示沒有開啓結果集緩存;若爲ENABLED則表示已經開啓而且可使用結果集緩存;若爲BYPASS則表示已經開啓結果集緩存但不可使用結果集緩存,此時能夠經過執行「EXEC DBMS_RESULT_CACHE.BYPASS(FALSE);」來使用結果集緩存。執行後若是返回值仍然是BYPASS,那麼多是參數RESULT_CACHE_MAX_SIZE的值爲0的緣由。STATUS函數返回值若爲SYNC則表示結果緩存是可用的,可是目前正與其它RAC節點從新同步。可使用SQL語句「SELECT DBMS_RESULT_CACHE.STATUS FROM DUAL;」來檢查是否開啓告終果集緩存機制。
l MEMORY_REPORT存儲過程:列出結果緩存內存利用的一個概要(默認)或詳細的報表。以下所示:
1SYS@orclasm > set serveroutput on 2SYS@orclasm > exec dbms_result_cache.Memory_Report; 3R e s u l t C a c h e M e m o r y R e p o r t 4[Parameters] 5Block Size = 1K bytes 6Maximum Cache Size = 2816K bytes (2816 blocks) 7Maximum Result Size = 140K bytes (140 blocks) 8[Memory] 9Total Memory = 169328 bytes [0.034% of the Shared Pool] 10... Fixed Memory = 5352 bytes [0.001% of the Shared Pool] 11... Dynamic Memory = 163976 bytes [0.033% of the Shared Pool] 12....... Overhead = 131208 bytes 13....... Cache Memory = 32K bytes (32 blocks) 14........... Unused Memory = 25 blocks 15........... Used Memory = 7 blocks 16............... Dependencies = 2 blocks (2 count) 17............... Results = 5 blocks 18................... SQL = 5 blocks (5 count) 19 20PL/SQL procedure successfully completed.
l FLUSH函數:清空整個結果緩存的內容。
l INVALIDATE函數:使結果緩存中某個特定對象的緩存結果無效。
l INVALIDATE_OBJECT函數:根據緩存ID使某個特定結果緩存無效。
能夠在表級別設置RESULT_CACHE,以下所示:
1ALTER TABLE HR.EMPLOYEES RESULT_CACHE(MODE FORCE);
下面給出一個服務器查詢結果集緩存示例:
1LHR@orclasm > show parameter result_cache 2 3NAME TYPE VALUE 4------------------------------------ -------------------------------- ------------------------------ 5client_result_cache_lag big integer 3000 6client_result_cache_size big integer 0 7result_cache_max_result integer 5 8result_cache_max_size big integer 2816K 9result_cache_mode string MANUAL 10result_cache_remote_expiration integer 0 11 12LHR@orclasm > create table t_rc_20170611_lhr as select * from dba_objects; 13 14Table created. 15 16 17LHR@orclasm > set autotrace traceonly 18LHR@orclasm > select /*+result_cache*/ * from t_rc_20170611_lhr where object_id=10; 19 20 21Execution Plan 22---------------------------------------------------------- 23Plan hash value: 3007689452 24 25------------------------------------------------------------------------------------------------- 26| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 27------------------------------------------------------------------------------------------------- 28| 0 | SELECT STATEMENT | | 13 | 2691 | 312 (1)| 00:00:04 | 29| 1 | RESULT CACHE | 4ns8fbzpm3a10agkanndg1mqbn | | | | | 30|* 2 | TABLE ACCESS FULL| T_RC_20170611_LHR | 13 | 2691 | 312 (1)| 00:00:04 | 31------------------------------------------------------------------------------------------------- 32 33Predicate Information (identified by operation id): 34--------------------------------------------------- 35 36 2 - filter("OBJECT_ID"=10) 37 38Result Cache Information (identified by operation id): 39------------------------------------------------------ 40 41 1 - column-count=15; dependencies=(LHR.T_RC_20170611_LHR); name="select /*+result_cache*/ * from t_rc_20170611_lhr where object_id=10" 42 43Note 44----- 45 - dynamic sampling used for this statement (level=2) 46 47 48Statistics 49---------------------------------------------------------- 50 24 recursive calls 51 0 db block gets 52 1226 consistent gets 53 1440 physical reads 54 0 redo size 55 1609 bytes sent via SQL*Net to client 56 519 bytes received via SQL*Net from client 57 2 SQL*Net roundtrips to/from client 58 0 sorts (memory) 59 0 sorts (disk) 60 1 rows processed 61 62LHR@orclasm > select /*+result_cache*/ * from t_rc_20170611_lhr where object_id=10; 63 64 65Execution Plan 66---------------------------------------------------------- 67Plan hash value: 3007689452 68 69------------------------------------------------------------------------------------------------- 70| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 71------------------------------------------------------------------------------------------------- 72| 0 | SELECT STATEMENT | | 13 | 2691 | 312 (1)| 00:00:04 | 73| 1 | RESULT CACHE | 4ns8fbzpm3a10agkanndg1mqbn | | | | | 74|* 2 | TABLE ACCESS FULL| T_RC_20170611_LHR | 13 | 2691 | 312 (1)| 00:00:04 | 75------------------------------------------------------------------------------------------------- 76 77Predicate Information (identified by operation id): 78--------------------------------------------------- 79 80 2 - filter("OBJECT_ID"=10) 81 82Result Cache Information (identified by operation id): 83------------------------------------------------------ 84 85 1 - column-count=15; dependencies=(LHR.T_RC_20170611_LHR); name="select /*+result_cache*/ * from t_rc_20170611_lhr where object_id=10" 86 87Note 88----- 89 - dynamic sampling used for this statement (level=2) 90 91 92Statistics 93---------------------------------------------------------- 94 0 recursive calls 95 0 db block gets 96 0 consistent gets 97 0 physical reads 98 0 redo size 99 1609 bytes sent via SQL*Net to client 100 519 bytes received via SQL*Net from client 101 2 SQL*Net roundtrips to/from client 102 0 sorts (memory) 103 0 sorts (disk) 104 1 rows processed 105SYS@orclasm > SELECT d.NAMESPACE,d.DEPEND_COUNT,d.SCN,d.INVALIDATIONS FROM V$RESULT_CACHE_OBJECTS d WHERE d.CACHE_ID='4ns8fbzpm3a10agkanndg1mqbn'; 106 107NAMES DEPEND_COUNT SCN INVALIDATIONS 108----- ------------ ---------- ------------- 109SQL 1 66062134 0 110SYS@orclasm > select * from v$result_cache_statistics; 111 112 ID NAME VALUE 113---------- ---------------------------------------- ------------------- 114 1 Block Size (Bytes) 1024 115 2 Block Count Maximum 2816 116 3 Block Count Current 32 117 4 Result Size Maximum (Blocks) 140 118 5 Create Count Success 5 119 6 Create Count Failure 0 120 7 Find Count 8 121 8 Invalidation Count 0 122 9 Delete Count Invalid 0 123 10 Delete Count Valid 0 124 11 Hash Chain Length 1 125 12 Find Copy Count 8 126
在第二次查詢的執行計劃中,發現邏輯讀已經變成0了,說明Result Cache起做用了。
(二)函數結果集緩存
Oracle數據庫用一個單獨的緩存區爲每個函數同時保存輸入和返回值。這個緩存區被鏈接到這個數據庫實例的全部會話共享。每當函數被調用時,數據庫就會檢查是否已經緩存了相同的輸入值。若是是,那麼函數就不用從新執行了,而是把緩存中的值簡單返回便可。每當發現要修改的是緩存所依賴的表,數據庫就會自動把緩存失效。
有兩種函數緩存機制,分別是肯定性函數緩存和函數結果集緩存。對於一個函數,若是有相同的IN和IN OUT參數,且函數的返回結果也相同,那麼這個函數就是肯定性的(DETERMINISTIC)。Oracle經過關鍵字DETERMINISTIC來代表一個函數是肯定性的,肯定性函數能夠用於建立基於函數的索引。函數結果集緩存指的是Oracle經過關鍵字RESULT_CACHE對函數返回的結果進行緩存,緩存結果能夠被全部會話共享。
下面給出一個函數結果集緩存的示例:
準備表:
1CREATE TABLE T_FRC_20170611_LHR AS SELECT * FROM DBA_OBJECTS; 2CREATE OR REPLACE FUNCTION FUN_OBJECTNAME_LHR(P_ID IN NUMBER) RETURN VARCHAR2 RESULT_CACHE AS 3 V_OBJECT VARCHAR2(200); 4BEGIN 5 SELECT OBJECT_NAME INTO V_OBJECT FROM T_FRC_20170611_LHR WHERE OBJECT_ID = P_ID; 6 RETURN V_OBJECT; 7END FUN_OBJECTNAME_LHR;
執行查詢:
1LHR@orclasm > SELECT FUN_OBJECTNAME_LHR(10) FROM DUAL; 2 3 4Execution Plan 5---------------------------------------------------------- 6Plan hash value: 1388734953 7 8----------------------------------------------------------------- 9| Id | Operation | Name | Rows | Cost (%CPU)| Time | 10----------------------------------------------------------------- 11| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 | 12| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 | 13----------------------------------------------------------------- 14 15 16Statistics 17---------------------------------------------------------- 18 30 recursive calls 19 0 db block gets 20 1216 consistent gets 21 1117 physical reads 22 0 redo size 23 545 bytes sent via SQL*Net to client 24 519 bytes received via SQL*Net from client 25 2 SQL*Net roundtrips to/from client 26 0 sorts (memory) 27 0 sorts (disk) 28 1 rows processed 29 30LHR@orclasm > SELECT FUN_OBJECTNAME_LHR(10) FROM DUAL; 31 32 33Execution Plan 34---------------------------------------------------------- 35Plan hash value: 1388734953 36 37----------------------------------------------------------------- 38| Id | Operation | Name | Rows | Cost (%CPU)| Time | 39----------------------------------------------------------------- 40| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 | 41| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 | 42----------------------------------------------------------------- 43 44 45Statistics 46---------------------------------------------------------- 47 0 recursive calls 48 0 db block gets 49 0 consistent gets 50 0 physical reads 51 0 redo size 52 545 bytes sent via SQL*Net to client 53 519 bytes received via SQL*Net from client 54 2 SQL*Net roundtrips to/from client 55 0 sorts (memory) 56 0 sorts (disk) 57 1 rows processed 58SYS@orclasm > SELECT d.NAMESPACE,d.DEPEND_COUNT,d.SCN,d.INVALIDATIONS FROM V$RESULT_CACHE_OBJECTS d WHERE D.NAMESPACE='PLSQL'; 59 60NAMES DEPEND_COUNT SCN INVALIDATIONS 61----- ------------ ---------- ------------- 62PLSQL 2 66067285 0 63 64LHR@orclasm > DELETE FROM T_FRC_20170611_LHR WHERE ROWNUM<=1; 65 661 row deleted. 67LHR@orclasm > COMMIT; 68 69Commit complete. 70 71LHR@orclasm >
(三)客戶端結果集緩存
初始化參數CLIENT_RESULT_CACHE_SIZE表示全部客戶端的總緩存大小,有關客戶端結果緩存本書再也不詳解,讀者能夠查閱相關的官方文檔來學習。