對於經常要查的結果集,返回少量記錄,服務器端是可以緩存的,結果集保存在共享池中,如果是綁定變量,綁定變量的值也要一樣。
SQL> show parameter result_cache
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_lag big integer 3000
client_result_cache_size big integer 0
result_cache_max_result integer 5
result_cache_max_size big integer 33440K
result_cache_mode string manual
result_cache_remote_expiration integer 0
--result_cache_max_result 指定任何單個結果集可以使用result_cache_max_size的大小(單位為百分比),默認為5,允許從1到100的值,超過這個限制的結果集會被雙色至為無效。
--result_cache_max_size 指定用來作為結果緩存的共享池內存的大小,如果被設置為0,表示這個特性被禁用。
--result_cache_mode 如果設置為MANUAL(這也是默認情況),只有指定hint result_cache的時候才能使用結果緩存;當為force的時候,所有不包含hint no_result_cache的查詢語句都會使用結果緩存,查詢第二次即生效;當為auto時,在11g下運行同樣的SQL第三次,緩存才起作用。
--result_cache_remote_expiration 緩存遠程對象的有效期(單位為分鐘),因為基於遠程對象的結果集無法由於遠程對象的變更而自動地變為無效,通常默認為0,這意味著基於遠程對象的查詢結果的緩存是被禁止的。
--result_cache_max_result和result_cache_max_size是系統級別的設置,result_cache_mode和result_cache_remote_expiration可以在會話級別修改。
SQL> alter system set result_cache_mode=force
SQL> SELECT COUNT(1)
2 FROM GG_DISTRIBUTION W
3 WHERE W.DATA_AREA LIKE '03' || '%'
4 AND W.CREATE_DATE > TO_DATE('2013-01-01', 'yyyy-GG-dd');
已用時間: 00: 00: 22.48
執行計劃
----------------------------------------------------------
Plan hash value: 3923546474
-------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 14 | 106K (1)| 00:24:46 | | |
| 1 | SORT AGGREGATE | | 1 | 14 | | | | |
| 2 | PARTITION RANGE ALL | | 2173K| 29M| 106K (1)| 00:24:46 | 1 | 2 |
| 3 | PARTITION LIST ITERATOR| | 2173K| 29M| 106K (1)| 00:24:46 | KEY | KEY |
|* 4 | TABLE ACCESS FULL | GG_DISTRIBUTION | 2173K| 29M| 106K (1)| 00:24:46 | 1 | 48 |
-------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - filter("W"."CREATE_DATE">TO_DATE(' 2013-01-01 00:00:00', 'syyyy-GG-dd hh24:mi:ss') AND
"W"."DATA_AREA" LIKE '03%')
統計信息
----------------------------------------------------------
0 recursive calls
0 db block gets
280123 consistent gets
263679 physical reads
0 redo size
339 bytes sent via SQL*Net to client
337 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> /
已用時間: 00: 00: 00.11
執行計劃
----------------------------------------------------------
Plan hash value: 3923546474
-------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 14 | 106K (1)| 00:24:46 | | |
| 1 | RESULT CACHE | 0mr1089p1wxv3919raqyvtwtsv | | | | | | |
| 2 | SORT AGGREGATE | | 1 | 14 | | | | |
| 3 | PARTITION RANGE ALL | | 2173K| 29M| 106K (1)| 00:24:46 | 1 | 2 |
| 4 | PARTITION LIST ITERATOR| | 2173K| 29M| 106K (1)| 00:24:46 | KEY | KEY |
|* 5 | TABLE ACCESS FULL | GG_DISTRIBUTION | 2173K| 29M| 106K (1)| 00:24:46 | 1 | 48 |
-------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter("W"."CREATE_DATE">TO_DATE(' 2013-01-01 00:00:00', 'syyyy-GG-dd hh24:mi:ss') AND "W"."DATA_AREA"
LIKE '03%')
Result Cache Information (identified by operation id):
-----------------------------------------------------
1 - column-count=1; dependencies=(LCAM_TEST.GG_DISTRIBUTION); attributes=(single-row); parameters=(nls); name="SELECT COUNT(1)
FROM GG_DISTRIBUTION W
WHERE W.DATA_AREA LIKE '03' || '%'
AND W.CREATE_DATE > TO_DATE('2013-01-01', 'yyyy-"
統計信息
----------------------------------------------------------
1 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
339 bytes sent via SQL*Net to client
337 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
可以根據RESULT CACHE=0mr1089p1wxv3919raqyvtwtsv找到其緩存的信息。
SQL> select s.STATUS,
s.CREATION_TIMESTAMP,
s.BUILD_TIME,
s.ROW_COUNT,
s.SCAN_COUNT
from v$result_cache_objects s
where cache_id = '0mr1089p1wxv3919raqyvtwtsv';
STATUS CREATION_TIMES BUILD_TIME ROW_COUNT SCAN_COUNT
--------- -------------- ---------- ---------- ----------
Published 20-6月 -14 700 1 26
結果緩存的限制:
當查詢語句使用非確定性函數、序列號和臨時表的時候不能被緩存。
查詢語句可能會造成數據不一致的時候。
引用到數據字典視圖的查詢語句不能緩存。
可以使用dbms_result_cache管理緩存。