等待事件分類
- Idle 事件: Oracle 空閒等待工作(如網絡收發、後台定時器),調優時可忽略。
- Non-Idle 事件: 實際負載產生的等待,是調優核心關注點。
常見 Idle 事件速查
dispatcher timer、lock element cleanup、Null event、parallel query dequeue/idle wait、pipe get、PL/SQL lock timer、pmon/rdbms ipc/smon timer、SQL*Net message from/to client、virtual circuit status 等。
核心 Non-Idle 事件深度解析
1. db file scattered read(全表掃描多塊讀)
- 特徵:多塊分散讀入 Buffer Cache(冷端 LRU)。
- 診斷:結合
V$SESSION_LONGOPS 定位長耗時全掃 SQL;檢查是否缺索引或統計信息過期導致 CBO 誤選全掃。
- 對策:建合適索引、小熱表
CACHE、收集統計信息、Hint 強制索引。
2. db file sequential read(索引單塊讀)
- 特徵:單塊讀,通常伴隨索引範圍掃描、表訪問。
- 高發原因:連接順序錯誤(未用驅動表)、過度索引、大表大量索引掃描不如全掃。
- 對策:調整連接順序、審視索引必要性、大範圍查詢考慮全掃/分區。
3. free buffer waits(無可用空閒緩衝)
- 原因:Buffer Cache 偏小、DBWR 寫出慢、磁盤 I/O 競爭。
- 對策:增大
DB_BUFFER_CACHE、增加 DBWR 進程、增加檢查點頻率、分散物理磁盤負載。
4. buffer busy waits(緩衝區忙)
- 細分熱點:Segment Header(增 freelists/freelist groups)、Undo Header(增回滾段/UNDO 表空間)、Undo Block(降低一致性讀密度/增大 Cache)、Data Block(增 PCTFREE/分區/哈希分佈/本地管理表空間)、Index Block(重建/分區/反向鍵索引/減小塊尺寸/增 PCTFREE)。
- ITL 競爭:增
INITRANS;9i+ 推薦 ASSM(自動段空間管理)徹底解決 freelist 爭用。
5. latch free(閂釋放失敗)
- 保護 SGA 共享結構的低級序列化鎖,自旋失敗進入睡眠重試。
- 高發場景:未用綁定變量、Redo 生成熱點、Cache Buffers LRU/Chain 熱塊。
- 對策:強制綁定變量(
CURSOR_SHARING=FORCE)、優化高硬解析 SQL、關注 Metalink 補丁;_SPIN_COUNT 默認 2000 一般無需調整。
6. log file sync(提交等待 LGWR 寫入 Redo)
- 本質:用戶提交/回滾觸發 LGWR 將 Redo 從 Log Buffer 刷盤並等待完成。
- 對策:批量提交(減少提交頻率)、Redo 放高速盤/裸設備/非 RAID5、分離 Redo 與數據文件、啟用異步 I/O。
7. log file switch(日志切換等待)
- 子事件:
archiving needed(歸檔跟不上)→ 增大日志/增組、歸檔放快盤、調 LOG_ARCHIVE_MAX_PROCESSES;checkpoint incomplete(DBWR 刷髒頁慢)→ 增 DBWR、增日志組/大小。
8. log file parallel write / control file parallel write
- LGWR/CKPT 並行寫 Redo/控制文件,等待所有 I/O 完成。關注磁盤 I/O 延遲,考慮異步 I/O、分盤、減少控制文件數(保底 2-3)。
9. direct path write(直接路徑寫)
- 大排序、並行 DML、LOB 寫入等產生的異步 I/O 完成等待。熱點常在臨時表空間 → 本地管理 + 多小文件分盤/裸設備。
診斷金律
- Top 5 等待全是 Idle → 系統閒置,無性能問題。
- 聚焦 Non-Idle Top 事件,結合
V$SYSTEM_EVENT/V$SESSION_WAIT/V$SESSION_LONGOPS 定位具體 SQL/對象/會話。
- 單一事件調優無效時,轉向系統級資源(CPU/內存/I/O/網絡)平衡。