Shared Pool 中的 Cache Miss 代價遠高於 Data Buffer,且 Data Dictionary 物件駐留時間較長,因此關鍵在於 Library Cache 優化。
SELECT gethitratio FROM v$librarycache WHERE namespace = 'SQL AREA';
SELECT SUM(pins) "executions", SUM(reloads) "cache misses",
SUM(reloads)/SUM(pins) "ratio" FROM v$librarycache;
shared_pool_size、修正無效物件引用shared_pool_size 的 10%~50%V$SHARED_POOL_RESERVED:REQUEST_MISSES = 0 或持平、FREE_MEMORY > 50% → 保留區過大,可縮減將大型匿名區塊轉為小區塊呼叫預存程序,減少 Library Cache 碎片。
9i 起可將 Execution Plan 與 SQL 文本同存 Library Cache,便於診斷。查詢 V$SQL_PLAN 即可檢視。
大型物件(Package、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');
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 間接擴大Oracle 官方提供 dbmspool.sql 協助 Shared Pool 管理。