Oracle 杨廷琨 等待事件实战
Oracle 杨廷琨 等待事件实战
来源:杨廷琨 (AskTOM 中文 / 啖汤) 适用版本:Oracle Database 全版本 文档版本:v1.0 / 2026-07-22
1. 概述
杨廷琨对等待事件有实战化分析[1]。
详细见:Oracle 等待事件详解。
2. 杨廷琨方法论
2.1 系统性
- 等待事件 + SQL + 会话
- 综合
- 不孤立
2.2 实战
- 真实案例
- 具体 SQL
- 解决方案
3. 系统级等待
3.1 TOP 等待
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;
3.2 Wait Class
SELECT wait_class, time_waited
FROM v$system_wait_class
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC;
3.3 杨廷琨分析
- User I/O:正常
- System I/O:正常
- Concurrency:高 → 问题
- Application:评估
4. 会话级
4.1 活跃会话
SELECT sid, serial#, username, event, state, seconds_in_wait
FROM v$session
WHERE username IS NOT NULL AND status='ACTIVE';
4.2 阻塞
SELECT sid, blocking_session, blocking_session_status, event
FROM v$session
WHERE blocking_session IS NOT NULL;
4.3 等待历史
SELECT event, wait_time, seconds_in_wait
FROM v$session_wait
WHERE sid = &sid;
5. 经典等待 1:db file sequential read
5.1 含义
- 索引单块读
- 正常(一定量)
5.2 杨廷琨分析
- 高:索引扫描多
- 评估是否必要
- 优化 SQL
5.3 P1/P2/P3
- P1: file#
- P2: block#
- P3: blocks (1)
5.4 查对象
SELECT owner, segment_name
FROM dba_extents
WHERE file_id = &p1 AND &p2 BETWEEN block_id AND block_id+blocks-1;
6. 经典等待 2:db file scattered read
6.1 含义
- 全表扫描
- 多块读
6.2 杨廷琨分析
- 高:全表扫描多
- 评估索引
- 分区
- SQL 优化
7. 经典等待 3:log file sync
7.1 含义
- COMMIT 等待 LGWR
7.2 杨廷琨分析
- 频繁 commit?
- Redo Log I/O 慢?
- 优化
7.3 关联
- log file parallel write(LGWR)
- 如果 parallel write 高 → 磁盘
- 如果 parallel write 低 → 应用 commit
8. 经典等待 4:buffer busy waits
8.1 含义
- 块争用
- 等待 pin
8.2 杨廷琨分析
- 热点块
- INSERT:段头
- SELECT/UPDATE:数据块
8.3 优化
- 减少热点
- 自动段空间管理
- 反向索引
- 分区
9. 经典等待 5:enq: TX - row lock
9.1 含义
- 行锁等待
- 事务未提交
9.2 杨廷琨分析
- 找阻塞会话
- 评估是否正常
- 长事务
9.3 解决
-- 找阻塞者
SELECT sid, serial#, sql_id FROM v$session
WHERE sid IN (SELECT blocking_session FROM v$session WHERE blocking_session IS NOT NULL);
-- 终止(必要时)
ALTER SYSTEM KILL SESSION 'sid,serial#';
10. 经典等待 6:latch: cache buffers chains
10.1 含义
- 块热块
- Latch 争用
10.2 杨廷琨分析
- 热点块
- 高并发
- 反向索引
- 分区
10.3 查找热块
SELECT * FROM v$latch_children
WHERE name = 'cache buffers chains'
ORDER BY gets DESC FETCH FIRST 10 ROWS ONLY;
11. 经典等待 7:library cache lock/pin
11.1 含义
- Library Cache 争用
- 解析问题
11.2 杨廷琨分析
- 未用绑定变量
- DDL 冲突
- 共享池不足
11.3 优化
- 绑定变量
- 共享池
- 评估
12. ASH 实战
12.1 实时 TOP
SELECT event, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY event ORDER BY count(*) DESC;
12.2 SQL TOP
SELECT sql_id, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24 AND sql_id IS NOT NULL
GROUP BY sql_id ORDER BY count(*) DESC;
12.3 杨廷琨推荐
- ASH 实时
- 历史对比
- 案例分析
13. AWR 对比
13.1 基线
- 正常时段 AWR
- 异常时段 AWR
- 对比
13.2 分析
- TOP 等待变化
- SQL 变化
- 资源变化
13.3 杨廷琨方法
- 对比找差异
- 聚焦变化
- 解决
14. 案例分析
14.1 案例:性能突变
- 上午正常,下午慢
- ASH 对比
- 发现新 SQL
- 优化
14.2 案例:间歇慢
- 偶发性
- ASH 历史
- 锁等待
- 长事务
14.3 案例:CPU 高
- 解析多
- 绑定变量
- Library Cache
15. 最佳实践
- 等待事件:入手
- TOP:聚焦
- P1/P2/P3:定位
- ASH:实时
- AWR:对比
- 会话级:定位
- 系统级:趋势
- 案例:学习
- 优化:验证
- 监控:持续
16. 参考资料
[1] 杨廷琨, “等待事件实战”, https://www.modb.co/u/yangtingkun [2] Oracle Database Reference 19c, “V$SYSTEM_EVENT”