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
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. 最佳实践
- Top 5 优先:瓶颈
- 分类诊断:精准
- 结合 ASH:实时
- 结合 AWR:历史
- 结合 SQL Monitor:执行
- 基线对比:异常
- 监控告警:及时
- 根因分析:彻底
- 小步优化:可验证
- 持续监控:循环
14. 参考资料
[1] Oracle Database Reference 19c, “Wait Events” https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/