Oracle Eygle 等待事件分析实战
Oracle Eygle 等待事件分析实战
来源:盖国强 (Eygle) / eygle.com 适用版本:Oracle Database 全版本 文档版本:v1.0 / 2026-07-22
1. 概述
等待事件分析是 Eygle 性能诊断的核心方法[1]。
详细见:Oracle 等待事件详解、Oracle ASH 性能分析实战。
2. Eygle 诊断方法论
2.1 核心思想
- 等待事件 = 性能瓶颈
- TOP 事件入手
- 系统性分析
- 案例驱动
2.2 步骤
1. 识别 TOP 等待
2. 分析根因
3. 优化
4. 验证
3. 等待事件分类
2.1 Application
- commit
- SQL*Net message
- 行锁
3.2 Concurrency
- latch
- mutex
- buffer busy
- enq
3.3 Commit
- log file sync
- LGWR
3.4 Configuration
- log file switch
- db file sequential read
3.5 System I/O
- db file sequential read
- db file scattered read
- log file parallel write
3.6 User I/O
- db file
- direct path
4. TOP 等待查询
4.1 系统级
SELECT event, time_waited, total_waits, average_wait
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC
FETCH FIRST 10 ROWS ONLY;
4.2 会话级
SELECT sid, event, time_waited, total_waits
FROM v$session_event
WHERE sid = &sid
ORDER BY time_waited DESC;
4.3 ASH
SELECT event, count(*)
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY event
ORDER BY count(*) DESC;
5. 经典等待事件
5.1 db file sequential read
- 索引读
- 单块
- 优化:索引、统计
5.2 db file scattered read
- 全表扫描
- 多块
- 优化:索引、分区
5.3 log file sync
- COMMIT 等待
- LGWR
- 优化:Redo Log
5.4 log file parallel write
- LGWR 写
- 磁盘 I/O
- 优化:磁盘
5.5 buffer busy waits
- 块争用
- 热点块
- 优化:减少争用
5.6 enq: TX - row lock
- 行锁
- 事务冲突
- 优化:commit
5.7 latch
- Latch 争用
- Library Cache 等
- 优化:绑定变量
5.8 free buffer waits
- DBWn 慢
- Buffer Cache
- 优化:DBWn、Buffer
详细见:Oracle Buffer Cache 工作原理详解。
6. Eygle 案例 1:log file sync
6.1 现象
- log file sync 高
- 应用慢
6.2 分析
- COMMIT 频繁
- Redo Log I/O 慢
6.3 优化
- 事务级 commit
- Redo Log 高速磁盘
- LOG_BUFFER 调整
6.4 验证
- 等待降低
- 性能提升
7. Eygle 案例 2:db file scattered read
7.1 现象
- 全表扫描多
- I/O 高
7.2 分析
SELECT sql_id, executions, disk_reads
FROM v$sql
ORDER BY disk_reads DESC
FETCH FIRST 10 ROWS ONLY;
7.3 优化
- 加索引
- 分区
- SQL 重写
8. Eygle 案例 3:latch: cache buffers chains
8.1 现象
- 块争用
- Latch 高
8.2 分析
- 热点块
- 并发高
8.3 优化
- 反向索引
- 分区
- 减少争用
9. Eygle 案例 4:enq: TX - row lock
9.1 现象
- 行锁等待
- 应用卡
9.2 分析
SELECT sid, blocking_session, event
FROM v$session
WHERE event LIKE 'enq: TX - row lock%';
9.3 优化
- 提交事务
- 调整顺序
- 减少冲突
10. AWR 分析
10.1 报告
@?/rdbms/admin/awrrpt.sql
10.2 TOP 等待
- Top 10 Foreground Events
- Wait Classes
- SQL ordered by ...
10.3 Eygle 方法
- 对比基线
- 找出变化
- 优化
详细见:Oracle AWR 性能报告分析。
11. ASH 分析
11.1 实时
SELECT event, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY event ORDER BY count(*) DESC;
11.2 SQL
SELECT sql_id, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY sql_id ORDER BY count(*) DESC;
11.3 Eygle 推荐
- ASH 实时
- 历史分析
- 短查询捕获
详细见:Oracle ASH 性能分析实战。
12. 诊断工具
12.1 Eygle 推荐
- AWR
- ASH
- 等待事件
- SQL 报告
- alert log
12.2 脚本
# sess.sql - 会话等待
SELECT sid, username, event, state
FROM v$session WHERE username IS NOT NULL;
# top_sql.sql - TOP SQL
SELECT sql_id, executions, elapsed_time
FROM v$sql ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;
13. 最佳实践
- 等待事件:入手
- TOP:聚焦
- 系统性:分析
- ASH:实时
- AWR:基线
- 对比:变化
- 案例:学习
- 优化:验证
- 监控:持续
- 文档:记录
14. 参考资料
[1] Eygle, “等待事件分析”, https://www.eygle.com [2] 盖国强, 《Oracle 数据库诊断案例与性能优化》