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

  1. 等待事件:入手
  2. TOP:聚焦
  3. P1/P2/P3:定位
  4. ASH:实时
  5. AWR:对比
  6. 会话级:定位
  7. 系统级:趋势
  8. 案例:学习
  9. 优化:验证
  10. 监控:持续

16. 参考资料

[1] 杨廷琨, “等待事件实战”, https://www.modb.co/u/yangtingkun [2] Oracle Database Reference 19c, “V$SYSTEM_EVENT”