Oracle 数据库等待事件详解

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


1. 概述

Oracle 等待事件是性能诊断核心[1]:

分类:

  • User I/O
  • System I/O
  • Application
  • Concurrency
  • Commit
  • Configuration
  • Network
  • Idle

详细见:Oracle 等待事件 Wait Events。


2. 关键等待事件

2.1 db file sequential read

含义:索引单块读

原因:
- 索引扫描
- 索引回表

优化:
- 减少索引扫描
- 优化 SQL

2.2 db file scattered read

含义:多块全表扫描

原因:
- 全表扫描
- 快速全索引扫描

优化:
- 加索引
- 优化分区

2.3 log file sync

含义:提交等待 LGWR

原因:
- 提交频繁
- I/O 慢

优化:
- 减少提交
- Redo 在专用磁盘

2.4 log file parallel write

含义:LGWR 写 Redo

原因:
- I/O 慢
- Redo 太多

优化:
- 快速磁盘
- Redo 分组

2.5 enq: TX - row lock contention

含义:行锁等待

原因:
- 事务未提交
- 行被锁

优化:
- 及时提交
- 优化事务

2.6 gc cr block 2-way/3-way

含义:RAC Cache Fusion

原因:
- 跨节点访问

优化:
- 服务隔离
- 序列 NOORDER


3. Buffer Busy Wait

3.1 buffer busy wait

含义:块争用

原因:
- 热点块
- ITL 不足

优化:
- 减少热点
- 增大 INITRANS

3.2 read by other session

含义:另一会话读

优化:
- 减少 I/O


4. Latch 等待

4.1 latch: cache buffers chains

含义:块链表争用

优化:
- 减少热点块
- 减少 I/O

4.2 latch: shared pool

含义:共享池争用

优化:
- 绑定变量
- 减少硬解析

4.3 latch: library cache

含义:库缓存争用

优化:
- 绑定变量
- 共享游标


5. Mutex 等待

5.1 cursor: pin S

含义:游标共享 pin

原因:高并发相同 SQL

优化:减少并发

5.2 library cache: mutex X

含义:库缓存互斥

优化:减少硬解析


6. Free Buffer Waits

6.1 free buffer waits

含义:等待空闲 Buffer

原因:
- DBWn 慢
- Buffer Cache 小

优化:
- 增大 Buffer Cache
- 增加 DBWn

6.2 write complete waits

优化:
- 减少 I/O
- 优化 DBWn


7. Network 等待

7.1 SQL*Net message from client

含义:等待客户端(Idle)

7.2 SQL*Net more data to client

含义:大量数据传输

优化:
- 增大 SDU
- 减少 SQL*Net 往返


8. Commit 等待

8.1 log file sync

详细见上文。

8.2 enqueue

优化:
- 减少锁持有时间


9. Application 等待

9.1 enq: TX - row lock contention

9.2 enq: TM - contention

含义:表锁

9.3 enq: UL - contention

含义:用户定义锁


10. 查看

10.1 系统级

SELECT 
  event,
  total_waits,
  time_waited,
  average_wait,
  wait_class
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC;

10.2 会话级

SELECT 
  sid,
  event,
  wait_class,
  seconds_in_wait,
  state
FROM v$session_wait
WHERE sid = &sid;

10.3 等待类

SELECT 
  wait_class,
  SUM(time_waited) AS total_time
FROM v$system_event
WHERE wait_class != 'Idle'
GROUP BY wait_class
ORDER BY total_time DESC;

10.4 ASH

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

11. 排查案例

11.1 案例:I/O 瓶颈

1. Top Event: db file sequential read 80%
2. 原因:大量索引读
3. 分析:缺索引导致回表多
4. 优化:复合索引

11.2 案例:锁等待

1. Top Event: enq: TX - row lock contention 60%
2. 找阻塞会话
3. 杀掉/优化

11.3 案例:内存不足

1. Top Event: latch: shared pool, free buffer waits
2. 原因:SGA 不足
3. 优化:增大 SGA

12. 常见坑与排错

12.1 等待事件多

-- 1. 分类诊断
-- 2. Top 5 优先
-- 3. 根因

12.2 Idle 误判

- Idle 是正常等待
- 关注非 Idle

13. 最佳实践

  1. Top 5 优先:瓶颈
  2. 分类诊断:精准
  3. 结合 ASH:实时
  4. 结合 AWR:历史
  5. 结合 SQL Monitor:执行
  6. 基线对比:异常
  7. 监控告警:及时
  8. 根因分析:彻底
  9. 小步优化:可验证
  10. 持续监控:循环

14. 参考资料

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