Oracle 数据库等待事件详解

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/