Cache Miss 成本遠高於 Buffer Cache,關鍵在 Library Cache。
| 指標 | 查詢 | 健康閾值 | 異常對策 |
|---|---|---|---|
| Gethitratio (SQL Area) | SELECT gethitratio FROM v$librarycache WHERE namespace='SQL AREA' | > 90% | 檢查應用碼,提升繫結變數使用率 |
| Reloads/Pins | SELECT SUM(reloads)/SUM(pins) FROM v$librarycache | < 1% | 增加 shared_pool_size 或修正無效物件引用 |
| Reserved Pool 使用率 | V$SHARED_POOL_RESERVED | Free > 50% 或 Request Misses=0 | 縮小 reserved_size (預設 10%,上限 50%) |
| Dictionary Cache Miss Ratio | SELECT SUM(getmisses)/SUM(gets) FROM v$rowcache | 單項 < 2%,總計 < 15% | 間接調大 shared_pool_size |
-- 找出未保留的大包裹/程序/函數
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 size_for_estimate, buffers_for_estimate,
estd_physical_read_factor, estd_physical_reads
FROM v$db_cache_advice
WHERE name='DEFAULT' AND advice_status='ON'
AND block_size=(SELECT value FROM v$parameter WHERE name='db_block_size');
以 estd_physical_read_factor <= 1 為目標擴容。
SELECT 1 - (phy.value - dir.value - lob.value) / log.value
FROM v$sysstat log, v$sysstat phy, v$sysstat dir, v$sysstat lob
WHERE log.name='session logical reads'
AND phy.name='physical reads'
AND dir.name='physical reads direct'
AND lob.name='physical reads direct (lob)';
目標 > 90%。提升手段:增大 Cache、多 Buffer Pool (KEEP/RECYCLE)、CACHE 表、排序/平行讀取專用 Cache。
表空間建立時指定 SEGMENT SPACE MANAGEMENT AUTO,消除自由列表爭用。
LOG_BUFFER (預設 ~500K)。V$SESSION_WAIT 是否有 log buffer wait、V$SYSSTAT 的 redo buffer allocation retries (應 < 1% redo entries)。DB_BLOCK_CHECKSUM=TRUE 增加 CPU 開銷但保障資料一致性。SELECT total_waits FROM v$system_event WHERE event='free buffer waits';
若等待顯著,考慮增加 DB_WRITER_PROCESSES 或使用非同步 I/O。