前言
Oracle 卓越效能核心在於資料高速緩衝區。本文深入解析緩衝區三種狀態(空閒、命中、髒块)轉換機制與 LRU/DIRTY 列表管理策略,並提供調優建議。
一、三種緩衝區狀態
- 空閒緩衝區:啟動時預先分配,無資料,等待寫入。免除臨時向 OS 申請記憶體的開銷。
- 命中緩衝區:已讀入資料塊,供多用戶共享存取。資料未修改,無需寫回磁碟。
- 髒緩衝區:資料已被修改(UPDATE/INSERT/DELETE),尚未寫回資料檔。需由 DBWn 背景程序定期刷新。
二、LRU 與 DIRTY 列表管理
Oracle 透過兩個雙向鏈表管理上萬個緩衝區:
- LRU 列表:串聯空閒、命中、未移入 DIRTY 的髒緩衝區。採用「中點插入」策略(8i+),新讀入區塊置於中點,頻繁存取者逐漸移向熱端(MRU 端),冷端供淘汰。
- DIRTY 列表:串聯需寫回磁碟的髒緩衝區,按修改時間排序,最舊優先寫入。
三、使用者查詢觸發的緩衝區搜尋流程
- 從 LRU 冷端掃描尋找空閒緩衝區。
- 遇到髒緩衝區 → 移入 DIRTY 列表,繼續掃描。
- 掃描完畢無足夠空閒區 → 觸發 DBWn 寫入 DIRTY 列表最舊髒區 → 釋放為空閒區 → 插入 LRU 冷端 → 重新掃描。
這解釋了大量查詢時偶發的延遲:正在等待 DBWn 完成寫入以騰出空間。
四、DBA 調優建議
- 配置充足記憶體:10g 官方建議 1 GB+,實務上 4 GB 以上效能明顯提升。
- 善用 WHERE 條件限制掃描範圍:減少讀入區塊數量,降低緩衝區壓力與 DBWn 觸發頻率。
- 精確選取欄位:避免
SELECT *,減少資料傳輸量。
- 資料庫專用伺服器:避免其他服務爭搶記憶體,導致緩衝區記憶體碎片化,降低 LRU 掃描效率。
小結
理解緩衝區三態與 LRU/DIRTY 列表互動,是診斷「緩衝區忙碌等待」、「DBWn 寫入瓶頸」等效能問題的基石。