Cache Miss在Shared Pool成本遠高於Buffer Cache。關鍵在Library Cache優化:
SELECT gethitratio FROM v$librarycache WHERE namespace='SQL AREA'; 否則檢查應用程式碼SELECT SUM(reloads)/SUM(pins) FROM v$librarycache; 超標則增加shared_pool_size或檢查SQL物件合法性V$SHARED_POOL_RESERVED,FREE_MEMORY > 50%時可壓縮DBMS_SHARED_POOL.KEEP('package_name'); 避免大型PL/SQL、Trigger、Sequence被踢出造成碎片SELECT SUM(getmisses)/SUM(gets) FROM v$rowcache; 應<15%,否則增大Shared PoolV$DB_CACHE_ADVICE: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)';
LOG_BUFFER預設~500K。檢查V$SESSION_WAIT的log buffer wait、V$SYSSTAT的redo buffer allocation retries (應<1%)SELECT total_waits FROM v$system_event WHERE event='free buffer waits'; 有等待則增加DBWn| 檢查項目 | 關鍵SQL | 警戒值 |
|---|---|---|
| Library Cache Hit Ratio | SELECT gethitratio FROM v$librarycache WHERE namespace='SQL AREA'; | > 90% |
| Reloads/Pins | SELECT SUM(reloads)/SUM(pins) FROM v$librarycache; | < 1% |
| Dictionary Cache Miss | SELECT SUM(getmisses)/SUM(gets) FROM v$rowcache; | < 15% |
| Buffer Cache Hit Ratio | 見上文複合查詢 | > 90% |
| Redo Buffer Retries | SELECT value FROM v$sysstat WHERE name='redo buffer allocation retries'; | 接近0,<1% |
| Sort Disk/Memory Ratio | SELECT disk.value/mem.value*100 FROM v$sysstat disk, v$sysstat mem WHERE disk.name='sorts (disk)' AND mem.name='sorts (memory)'; | < 5% |
原則:由共用池著手,再調整Buffer Cache,最後處理Redo/排序/競爭,層層遞進,避免過度調優。