首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 緩存表機制深度解析:Buffer Pool 三區架構、KEEP/RECYCLE 策略與驗證腳本

     編輯:Oracle 資料庫基礎

前言:緩存表 ≠ 釘住內存

很多開發者誤以為 ALTER TABLE ... CACHE 就能永久釘住表在內存。實際上,Oracle Buffer Cache 分三區,**KEEP 區僅「優先保留」而非「永不淘汰」**。本文解析三區架構、正確操作命令、驗證查詢及手工淘汰技巧。

一、 Buffer Cache 三區架構

二、 核心操作命令

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;

三、 關鍵誤區澄清

池名稱初始化參數設計目標適用對象
DEFAULTDB_CACHE_SIZE通用 LRU 淘汰大多數表、索引
KEEPDB_KEEP_CACHE_SIZE盡量保留熱塊,降低淘汰概率小表、查詢極頻、不可容忍物理讀 (如代碼表、配置表)
RECYCLEDB_RECYCLE_CACHE_SIZE快速淘汰,避免污染 DEFAULT 池大表全掃描、歷史歸檔表、一次性報表表

四、 手工淘汰與監控腳本

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;

五、 總結與建議

  1. 小熱表:STORAGE (BUFFER_POOL KEEP) CACHE 雙重保障。
  2. 大冷表:STORAGE (BUFFER_POOL RECYCLE) NOCACHE 避免污染。
  3. DEFAULT 池:無特殊屬性表自動使用,依賴 Oracle 智能 LRU。
  4. 內存規劃:DB_CACHE_SIZE + DB_KEEP_CACHE_SIZE + DB_RECYCLE_CACHE_SIZE ≤ 物理內存 70% (留 30% 給 PGA/OS)。
  5. 驗證習慣:變更後必查 DBA_TABLES.BUFFER_POOL/CACHE 確認生效。

理解「存儲屬性決定去哪個池、CACHE 屬性決定在池內怎麼排隊」,才能精準控制緩存行為,避免盲目設參數導致內存浪費或性能抖動。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
誤區事實
KEEP 池表永不被淘汰KEEP 池同樣受 LRU 管理,內存壓力大時仍會淘汰,只是優先級更高
CACHE 即時將全表讀入內存CACHE 僅影響「全表掃描時塊的放入位置 (MRU vs LRU)」,不觸發預讀
ALTER TABLE ... CACHE 需鎖表僅元數據操作,極快,無業務阻塞