PLSQL_性能优化系列20_Oracle Result Cash结果缓存
20150528 Created By BaoXinjian
一、摘要
SQL 查詢結果高速緩存可在數據庫內存中對查詢結果集和查詢碎片啟用顯式高速緩存。
存儲在共享池(Share Pool)中的專用內存緩沖區可用于存儲和檢索高速緩存的結果。
對查詢訪問的數據庫對象中的數據進行修改后,存儲在該高速緩存中的查詢結果將失效。
?
雖然SQL 查詢高速緩存可用于任何查詢,但最適用于需要訪問大量行卻僅返回其中一少部分的語句。 數據倉庫應用程序大多屬于這種情況。
1. 注意點:
(1). RAC 配置中的每個節點都有一個專用的結果高速緩存。
一個實例的高速緩存結果不能供另一個實例使用。
但是,失效會對多個實例產生影響。
要處理RAC 實例之間與SQL 查詢結果高速緩存相關的所有同步操作,需對每個實例使用專門的RCBG 進程。
(2). 通過并行查詢,可對整個結果進行高速緩存(在RAC 中,是在查詢協調程序實例上執行高速緩存的),但單個并行查詢進程無法使用高速緩存。
2.? 簡言之:
高速緩存查詢或查詢塊的結果以供將來重用。
可跨語句和會話使用高速緩存,除非該高速緩存已過時。
3. 優點:
可擴展性
降低內存使用量
4. 適用的語句:
訪問多行
返回少數行
?
二、設置SQL查詢結果高速緩存
查詢優化程序根據初始化參數文件中RESULT_CACHE_MODE 參數的設置管理結果高速緩存機制。
可以使用此參數確定優化程序是否將查詢結果自動發送到結果高速緩存中。
可以在系統和會話級別設置RESULT_CACHE_MODE 參數。
?
參數值可以是AUTO、MANUAL 和FORCE:
(1) 設置為AUTO 時,優化程序將根據重復的執行操作確定將哪些結果存儲在高速緩存中。
(2) 設置為MANUAL(默認值)時,必須使用RESULT_CACHE 提示指定在高速緩存中存儲特定結果。
(3) 設置為FORCE 時,所有結果都將存儲在高速緩存中。
注:對于AUTO 和FORCE 設置,如果語句中包含[NO_]RESULT_CACHE 提示,則該提示優先于參數設置。
?
三、管理SQL查詢結果高速緩存
可以改變初始化參數文件中的多種參數設置,以管理數據庫的SQL 查詢結果高速緩存。
默認情況下,數據庫會為SGA 中共享池(Share Pool)內的結果高速緩存分配內存。
分配給結果高速緩存的內存大小取決于SGA的內存大小以及內存管理系統。
可以通過設置RESULT_CACHE_MAX_SIZE參數來更改分配給結果高速緩存的內存。
如果將結果高速緩存的值設為0,則會禁用此結果高速緩存。
此參數的值將四舍五入到不超過指定值的32 KB的最大倍數。如果四舍五入得到的值是0,則會禁用該功能。
?
使用RESULT_CACHE_MAX_RESULT參數可以指定任一結果可使用的最大高速緩存量。
默認值為5%,但可指定1 到100 之間的任一百分比值。可在系統和會話級別上實施此參數。
使用RESULT_CACHE_REMOTE_EXPIRATION參數可以指定依賴于遠程數據庫對象的結果保持有效的時間(以分鐘為單位)。
默認值為0,表示不會高速緩存使用遠程對象的結果。
將此參數設置為非零值可能會生成過時的信息:例如,當結果使用的遠程表在遠程數據庫上發生了更改時。
?
使用以下初始化參數進行管理:
1. RESULT_CACHE_MAX_SIZE
– 此參數設置分配給結果高速緩存的內存。
– 如果將其值設為0,則會禁用結果高速緩存。
– 默認值取決于其它內存設置(memory_target的0.25% 或sga_target 的0.5% 或shared_pool_size 的1%)
– 不能大于共享池的75%
2. RESULT_CACHE_MAX_RESULE
– 設置單個結果的最大高速緩存
– 默認值為5%
3. RESULT_CACHE_REMOTE_EXPIRATION
– 根據遠程數據庫對象設置高速緩存結果的過期時間
– 默認值為0
?
四、通過Hint測試Result Cashe
Step1. 創建測試數據表gavin.test_resultcache
Step2.1 第一次運行select count(*) from gavin.test_resultcache;
我們第一次執行該SQL可以看到consistent gets和physical reads大致相同
SQL> set autotrace on; SQL> select count(*) from gavin.test_resultcache;COUNT(*) ----------73258Execution Plan ----------------------------------------------------------0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=293 Card=1)1 0 SORT (AGGREGATE)2 1 TABLE ACCESS (FULL) OF 'TEST_RESULTCACHE' (TABLE) (Cost=293 Card=72217)Statistics ----------------------------------------------------------28 recursive calls0 db block gets1118 consistent gets1044 physical reads0 redo size352 bytes sent via SQL*Net to client503 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processedStep2.2? 第二次運行select count(*) from gavin.test_resultcache;
再次執行同樣查詢時,由于數據Cache在內存中,physical reads會減少到0,但是consistent gets仍然不變
Statistics ----------------------------------------------------------0 recursive calls0 db block gets1049 consistent gets0 physical reads0 redo size352 bytes sent via SQL*Net to client503 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processed
Step2.3? 第三次運行select count(*) from gavin.test_resultcache;
加入/*+ result_cache*/將查詢結果放入高速緩存中
SQL> select /*+ result_cache */ count(*) from gavin.test_resultcache;COUNT(*) ----------73258Execution Plan ----------------------------------------------------------0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=293 Card=1)1 0 RESULT CACHE OF '8asjtwtjdzshb8jmtfy6s1rzv9'2 1 SORT (AGGREGATE)3 2 TABLE ACCESS (FULL) OF 'TEST_RESULTCACHE' (TABLE) (Cost=293 Card=72217)Statistics ----------------------------------------------------------4 recursive calls0 db block gets1116 consistent gets0 physical reads0 redo size352 bytes sent via SQL*Net to client503 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processedStep2.4? 第四次運行select count(*) from gavin.test_resultcache;?
在這個利用到Result Cache的查詢中,consistent gets減少到0,直接訪問結果集,不再需要執行SQL查詢。
這就是Result Cache的強大之處。
SQL> select /*+ result_cache */ count(*) from gavin.test_resultcache;COUNT(*) ----------73258Execution Plan ----------------------------------------------------------0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=293 Card=1)1 0 RESULT CACHE OF '8asjtwtjdzshb8jmtfy6s1rzv9'2 1 SORT (AGGREGATE)3 2 TABLE ACCESS (FULL) OF 'TEST_RESULTCACHE' (TABLE) (Cost=293 Card=72217)Statistics ----------------------------------------------------------0 recursive calls0 db block gets0 consistent gets0 physical reads0 redo size352 bytes sent via SQL*Net to client503 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processedStep3. 通過視圖查看result cashe的使用和管理情況
1. 通過查詢v$result_cache_memory視圖來看Cache的使用情況
?
2. 通過查詢v$result_cache_statistics視圖來看Result Cache的統計信息
?
3. 通過查詢v$result_cache_objects視圖來記錄了Cache的對象
Step4. 通過dbms包查看result cashe的使用情況
SQL> set serveroutput on; 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 = 1M bytes (1K blocks) Maximum Result Size = 51K bytes (51 blocks) [Memory] Total Memory = 107836 bytes [0.068% of the Shared Pool] ... Fixed Memory = 9440 bytes [0.006% of the Shared Pool] ... Dynamic Memory = 98396 bytes [0.062% of the Shared Pool] ....... Overhead = 65628 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.?
Thanks and Regards
參考:Eygle - http://www.eygle.com/archives/2007/09/11g_server_result_cache.html
參考:Linux - http://www.linuxidc.com/Linux/2012-12/76119.htm
轉載于:https://www.cnblogs.com/eastsea/p/4536909.html
總結
以上是生活随笔為你收集整理的PLSQL_性能优化系列20_Oracle Result Cash结果缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 23种设计模式的有趣见解 .
- 下一篇: nodeJS下利用mongdb进行数据库