| 池名稱 | 初始化參數 | 設計目標 | 適用對象 |
| DEFAULT | DB_CACHE_SIZE | 通用 LRU 淘汰 | 大多數表、索引 |
| KEEP | DB_KEEP_CACHE_SIZE | 盡量保留熱塊,降低淘汰概率 | 小表、查詢極頻、不可容忍物理讀 (如代碼表、配置表) |
| RECYCLE | DB_RECYCLE_CACHE_SIZE | 快速淘汰,避免污染 DEFAULT 池 | 大表全掃描、歷史歸檔表、一次性報表表 |
二、 核心操作命令
1. 指定表進入 KEEP/RECYCLE 池 (存儲屬性)
-- 僅設置存儲屬性,不代表立即緩存
ALTER TABLE my_hot_table STORAGE (BUFFER_POOL KEEP);
ALTER TABLE my_archive_table STORAGE (BUFFER_POOL RECYCLE);
驗證存儲屬性:
SELECT table_name, buffer_pool FROM dba_tables WHERE buffer_pool IN ('KEEP','RECYCLE');
2. 啟用 CACHE 屬性 (讀取時放入 MRU 端)
ALTER TABLE my_hot_table CACHE; -- 全表掃描時塊放入 MRU,不易被淘汰
ALTER TABLE my_hot_table NOCACHE; -- 默認行為,全掃塊放入 LRU 末端,快速淘汰
驗證 CACHE 屬性:
SELECT table_name, cache FROM dba_tables WHERE cache = 'Y';
3. 組合最佳實踐
-- 熱點小表:KEEP 池 + CACHE 屬性 = 雙重保障
ALTER TABLE code_table STORAGE (BUFFER_POOL KEEP) CACHE;
三、 關鍵誤區澄清
| 誤區 | 事實 |
| KEEP 池表永不被淘汰 | KEEP 池同樣受 LRU 管理,內存壓力大時仍會淘汰,只是優先級更高 |
| CACHE 即時將全表讀入內存 | CACHE 僅影響「全表掃描時塊的放入位置 (MRU vs LRU)」,不觸發預讀 |
| ALTER TABLE ... CACHE 需鎖表 | 僅元數據操作,極快,無業務阻塞 |
四、 手工淘汰與監控腳本
1. 手工淘汰表塊 (10g+)
-- 1. 刷新該表所有髒塊到磁盤 (可選)
ALTER SYSTEM FLUSH BUFFER_CACHE; -- 慎用!全庫生效
-- 2. 更精準:利用 DBMS_SHARED_POOL 對象級別 (僅共享池)
-- Buffer Cache 無直接 PL/SQL 包淘汰特定表塊,變通方案:
ALTER TABLE my_table NOCACHE; -- 後續全掃描將走 LRU 末端
-- 或縮小 KEEP 池迫使淘汰 (影響面大)
ALTER SYSTEM SET DB_KEEP_CACHE_SIZE = 10M SCOPE=MEMORY;
2. 監控表在緩存中的塊數
SELECT o.object_name, COUNT(*) AS cached_blocks
FROM v$bh bh
JOIN dba_objects o ON bh.objd = o.object_id
WHERE o.object_type = 'TABLE'
AND o.owner = 'SCOTT'
AND o.object_name = 'EMP'
GROUP BY o.object_name;
3. 查看三區命中率
SELECT name, block_size,
(1 - (physical_reads / (db_block_gets + consistent_gets))) * 100 AS hit_ratio
FROM v$buffer_pool_statistics;
五、 總結與建議
- 小熱表:
STORAGE (BUFFER_POOL KEEP) CACHE 雙重保障。
- 大冷表:
STORAGE (BUFFER_POOL RECYCLE) NOCACHE 避免污染。
- DEFAULT 池:無特殊屬性表自動使用,依賴 Oracle 智能 LRU。
- 內存規劃:
DB_CACHE_SIZE + DB_KEEP_CACHE_SIZE + DB_RECYCLE_CACHE_SIZE ≤ 物理內存 70% (留 30% 給 PGA/OS)。
- 驗證習慣:變更後必查
DBA_TABLES.BUFFER_POOL/CACHE 確認生效。
理解「存儲屬性決定去哪個池、CACHE 屬性決定在池內怎麼排隊」,才能精準控制緩存行為,避免盲目設參數導致內存浪費或性能抖動。
- 上一篇文章: Oracle Java 存儲過程訪問數據與創建全流程:從 LoadJava 到 Call Spec 詳解
- 下一篇文章: Oracle 高級數據訪問控制與 Java 存儲過程實戰:BMP 主鍵生成、邏輯共享、安全審計
Copyright ©
程式碼之家 All Rights Reserved