Oracle 等待事件与处理策略

Oracle 等待事件与处理策略

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

本文档汇总常见等待事件及处理策略[1]:

详细见:Oracle 等待事件 Wait EventsOracle 数据库等待事件详解


2. I/O 等待

2.1 db file sequential read

含义:索引单块读

优化

  • 减少索引扫描
  • 优化 SQL
  • 索引精简

2.2 db file scattered read

含义:多块全表扫描

优化

  • 加索引
  • 分区裁剪
  • 并行

2.3 direct path read

含义:直接路径读(并行、ASMM)

优化

  • 减少 I/O
  • 并行优化

2.4 direct path write

含义:直接路径写

优化

  • 减少 I/O
  • 排序优化

3. Redo 等待

3.1 log file sync

含义:提交等待 LGWR

优化

  • 减少提交频率
  • Redo SSD
  • Redo 多成员

3.2 log file parallel write

含义:LGWR 写 Redo

优化

  • Redo SSD
  • Redo 分组

3.3 log buffer space

含义:Redo Buffer 满

优化

  • 增大 log_buffer
  • 优化 Redo

4. Buffer 等待

4.1 buffer busy wait

含义:块争用

优化

  • 减少热点
  • INITRANS
  • 分区

4.2 free buffer waits

含义:等待空闲 Buffer

优化

  • 增大 Buffer Cache
  • 增加 DBWn
  • 优化 I/O

4.3 write complete waits

含义:等待 DBWn 写完

优化

  • 增大 Buffer Cache
  • 增加 DBWn
  • 减少 I/O

5. 锁等待

5.1 enq: TX - row lock contention

含义:行锁

优化

  • 及时提交
  • 优化事务顺序

5.2 enq: TM - contention

含义:表锁

优化

  • 减少 DDL
  • 优化 DML

5.3 enq: TX - allocate ITL entry

含义:ITL 不足

优化

  • INITRANS
  • PCTFREE
  • 重建表

6. Latch 等待

6.1 latch: cache buffers chains

含义:块链表争用

优化

  • 减少热点块
  • 反向索引
  • 分区

6.2 latch: shared pool

含义:共享池争用

优化

  • 绑定变量
  • 减少 SQL
  • 增大 Shared Pool

6.3 latch: library cache

含义:库缓存争用

优化

  • 绑定变量
  • 共享游标

7. Mutex 等待

7.1 cursor: pin S

含义:游标共享 pin

优化

  • 减少并发
  • 共享游标

7.2 library cache: mutex X

含义:库缓存互斥

优化

  • 减少硬解析
  • 绑定变量

8. RAC 等待

8.1 gc cr block 2-way/3-way

含义:Cache Fusion

优化

  • 服务分离
  • 序列 NOORDER
  • 减少跨节点

8.2 gc buffer busy

含义:Buffer 争用

优化

  • 减少跨节点访问
  • 分区

9. 网络等待

9.1 SQL*Net message from client

含义:等待客户端(Idle)

优化

  • 应用响应快

9.2 SQL*Net more data to client

含义:大量数据传输

优化

  • 增大 SDU
  • Array Fetch

10. Application 等待

10.1 enq: UL - contention

含义:用户锁

10.2 PX Deq: Execute Reply

含义:并行等待

优化

  • 并行优化

11. 处理策略

11.1 系统级

-- 1. Top 5 等待
SELECT event, total_waits, time_waited
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC
FETCH FIRST 5 ROWS ONLY;

-- 2. 等待类
SELECT wait_class, SUM(time_waited) 
FROM v$system_event 
WHERE wait_class != 'Idle'
GROUP BY wait_class
ORDER BY 2 DESC;

11.2 会话级

SELECT 
  sid, 
  event, 
  wait_class,
  seconds_in_wait,
  sql_id
FROM v$session
WHERE status = 'ACTIVE'
  AND event NOT LIKE 'SQL*Net%';

11.3 ASH

SELECT 
  event, 
  COUNT(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/24
GROUP BY event
ORDER BY samples DESC;

12. 等待分类总结

类别等待事件优化方向
User I/Odb file * read索引、I/O
System I/Olog file * writeRedo
Applicationenq: TX锁、事务
Concurrencylatch、mutex解析、热点
Commitlog file sync提交
NetworkSQL*Net网络
Idleclient、timer正常

13. 常见坑与排错

13.1 误判

- Idle 当问题
- 多个等待叠加
- 根因未找

13.2 过度优化

- 单点优化
- 忽略整体
- 副作用

14. 最佳实践

  1. Top 5 优先:瓶颈
  2. 分类诊断:精准
  3. ASH 实时:定位
  4. AWR 历史:趋势
  5. 基线对比:异常
  6. 根因分析:彻底
  7. 小步优化:可验证
  8. 监控告警:及时
  9. 持续监控:循环
  10. 文档化:积累

15. 参考资料

[1] Oracle Database Reference 19c, “Wait Events” https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/