SELECT 1 - ( (physical.value - direct.value - lobs.value) / logical.value ) AS "Buffer Cache Hit Ratio"
FROM v$sysstat physical,
v$sysstat direct,
v$sysstat lobs,
v$sysstat logical
WHERE physical.name = 'physical reads'
AND direct.name = 'physical reads direct'
AND lobs.name = 'physical reads direct (lob)'
AND logical.name = 'session logical reads';
**目標**:> 90% (OLTP 建議 > 95%)。若偏低,優先檢查 SQL 邏輯而非盲目加記憶體。
| 工具/視圖 | 關鍵指標 | 用途 |
|---|---|---|
V$SYSSTAT | free buffer inspected, free buffer waits, buffer busy waits | 非命中率細分:掃描免費塊耗時、等待免費塊、緩衝忙碌等待 |
| Statspack / AWR | Buffer Cache 區段報告 | 歷史趨勢、Top SQL 貢獻度 |
| Performance Manager (OEM) | 即時圖表 | 視覺化監控、閾值告警 |
-- 9i: DB_CACHE_SIZE (取代 DB_BLOCK_BUFFERS)
ALTER SYSTEM SET DB_CACHE_SIZE = 500M SCOPE=BOTH;
-- 10g+ 自動記憶體管理 (AMM/ASMM) 更彈性
ALTER SYSTEM SET SGA_TARGET = 2G SCOPE=BOTH;
-- 開啟建議引擎
ALTER SYSTEM SET DB_CACHE_ADVICE = ON SCOPE=BOTH;
-- 查詢建議
SELECT size_for_estimate, buffers_for_estimate,
estd_physical_read_factor, estd_physical_reads
FROM v$db_cache_advice
ORDER BY size_for_estimate;
觀察 ESTD_PHYSICAL_READ_FACTOR 下降趨勢,尋找「邊際效益遞減點」。
| Pool | 參數 | 適用物件 |
|---|---|---|
| KEEP | DB_KEEP_CACHE_SIZE | 小型熱點表、查詢頻繁的查找表 (Code Table) |
| RECYCLE | DB_RECYCLE_CACHE_SIZE | 大型一次性掃描表、歷史歸檔表 |
| DEFAULT | DB_CACHE_SIZE | 其餘一般物件 |
-- 建表指定 Pool
CREATE TABLE hot_lookup (...) STORAGE (BUFFER_POOL KEEP);
CREATE TABLE big_archive (...) STORAGE (BUFFER_POOL RECYCLE);
ALTER TABLE existing_table STORAGE (BUFFER_POOL KEEP);
ALTER TABLE small_ref_table CACHE; -- 9i/10g
-- 或放入 KEEP Pool (更精確控制)
LARGE_POOL_SIZE 預設 8M,監控 V$SGASTAT WHERE POOL='large pool' 免費空間。JAVA_POOL_SIZE 監控同樣查 V$SGASTAT。Buffer Cache 優化**不是單純加記憶體**,而是:**測量命中率 → 識別非命中根因 (熱點表、大掃描、排序溢寫) → 針對性策略 (KEEP/RECYCLE/CACHE/Advisory) → 持續監控**。9i 奠基了動態調整與多 Pool 架構,現代版本 (19c/21c) 更引入 In-Memory Column Store,將熱點資料以行/欄雙格式驻留,徹底改寫存取路徑。