【DB筆試面試611】在Oracle中,什麼是結果集緩存?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

♣          題目         部分

在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表示全部客戶端的總緩存大小,有關客戶端結果緩存本書再也不詳解,讀者能夠查閱相關的官方文檔來學習。

相關文章
相關標籤/搜索