Shared Pool Cache Miss 代價遠大於 Buffer Cache Miss。關鍵在 Library Cache(SQL/PL/SQL 區)。
| 指標 | 查詢 | 健康閾值 | 異常處理 |
|---|---|---|---|
| SQL Area Get Hit Ratio | SELECT gethitratio FROM v$librarycache WHERE namespace='SQL AREA'; |
> 90% | 檢查應用是否使用綁定變數、是否大量硬解析 |
| Library Cache Reloads/Pins | SELECT SUM(pins), SUM(reloads), SUM(reloads)/SUM(pins) FROM v$librarycache; |
< 1% | 增大 SHARED_POOL_SIZE;檢查無效物件導致重解析 |
| Reserved Pool 使用率 | SELECT * FROM v$shared_pool_reserved; |
Free > 50% 或 Request Misses=0 | 過大則壓縮 SHARED_POOL_RESERVED_SIZE(建議 10%,上限 50%) |
| Dictionary Cache Miss Ratio | SELECT SUM(getmisses)/SUM(gets) FROM v$rowcache; |
總計 < 15%,單項 < 2% | 間接透過增大 Shared Pool 改善 |
-- 找出未釘選的大型 PL/SQL 物件
SELECT * FROM v$db_object_cache
WHERE sharable_mem > 10000
AND type IN ('PACKAGE','PROCEDURE','FUNCTION','PACKAGE BODY')
AND kept = 'NO';
-- 釘選常用大物件:常用 Package、觸發器、Sequence(防號碼遺失)
EXEC DBMS_SHARED_POOL.KEEP('schema.package_name');
SELECT sql_text FROM v$sqlarea WHERE command_type=47 AND LENGTH(sql_text)>500;V$SQL_PLAN 保存執行計畫,利於事後診斷。CURSOR_SHARING=SIMILAR 減少硬解析(評估副作用)。DB_CACHE_SIZE 需為 Granule 整數倍。V$DB_CACHE_ADVICE 科學調整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)';
ALTER TABLE ... CACHE、Sort/Parallel 專用 Cache。表空間採用 SEGMENT SPACE MANAGEMENT AUTO,消除 Free List 爭用。
LOG_BUFFER(預設 ~500K,OS 相關)。V$SESSION_WAIT 是否有 log buffer wait;V$SYSSTAT redo buffer allocation retries 接近 0(< 1% redo entries)。LOG_CHECKPOINT_INTERVAL/TIMEOUT;Alert.log 出現 checkpoint not complete 需調整。LOG_ARCHIVE_MAX_PROCESSES。DB_BLOCK_CHECKSUM=TRUE 增加 CPU 但保障一致性。SELECT total_waits FROM v$system_event WHERE event='free buffer waits';
有等待 → 增加 DB_WRITER_PROCESSES 或改善 Buffer Cache/磁碟 I/O。