Shared Pool 的 Cache Miss 成本遠高於 Data Buffer。Dictionary Cache 留存時間較長,關鍵在於 **Library Cache** 效能。核心指標三件套:
SELECT gethitratio FROM v$librarycache WHERE namespace = 'SQL AREA';
若未達標,優先檢查應用程式:是否使用綁定變數?是否重複解析相似 SQL?
SELECT SUM(pins) "executions", SUM(reloads) "cache misses",
SUM(reloads)/SUM(pins) ratio FROM v$librarycache;
超標兩大原因:Shared Pool 空間不足、SQL 參照物件失效(如 DDL 導致游標失效)。
預設 10% Shared Pool,上限 50%。檢查:
SELECT * FROM v$shared_pool_reserved;
REQUEST_MISSES = 0 或持平、FREE_MEMORY > 50% 表示過大,可壓縮。
將大型匿名區塊改為「小匿名區塊呼叫預存程序」,減少解析與記憶體碎片。
V$SQL_PLAN 保存執行計畫,利於事後診斷。
大物件是記憶體碎片主因。查找未釘住的大型 Package/Procedure/Trigger/Sequence:
SELECT * FROM v$db_object_cache
WHERE sharable_mem > 10000
AND type IN ('PACKAGE','PROCEDURE','FUNCTION','PACKAGE BODY')
AND kept = 'NO';
釘住指令:
EXEC dbms_shared_pool.keep('package_name');
對應腳本:dbmspool.sql
SELECT sql_text FROM v$sqlarea
WHERE command_type = 47 AND LENGTH(sql_text) > 500;
處理方案:拆解為預存程序呼叫,或同樣釘住。
SELECT SUM(getmisses)/SUM(gets) FROM v$rowcache;
shared_pool_size| 指標 | 標準 | 應對 |
|---|---|---|
| SQL Area Gethitratio | > 90% | 優化應用綁定變數、減少硬解析 |
| Reloads/Pins | < 1% | 增大 Shared Pool / 修復失效物件 |
| Reserved Pool 使用率 | REQUEST_MISSES=0 或 FREE>50% | 縮減 Reserved Pool |
| Dictionary Cache Miss | 總計 < 15% | 增大 shared_pool_size |
定期排程執行上述查詢,建立基準線。發現指標惡化時,優先檢查應用端是否新增未使用綁定變數的 SQL、是否頻繁 DDL 導致失效,再考慮調整記憶體參數。