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. 最佳实践

  1. 等待事件:入手
  2. TOP:聚焦
  3. 系统性:分析
  4. ASH:实时
  5. AWR:基线
  6. 对比:变化
  7. 案例:学习
  8. 优化:验证
  9. 监控:持续
  10. 文档:记录

14. 参考资料

[1] Eygle, “等待事件分析”, https://www.eygle.com [2] 盖国强, 《Oracle 数据库诊断案例与性能优化》