Oracle Maclean Wait Interface 详解
Oracle Maclean Wait Interface 详解
来源:Maclean Liu (刘相兵) / oradb.me 适用版本:Oracle Database 全版本 文档版本:v1.0 / 2026-07-22
1. 概述
Wait Interface 是 Oracle 性能诊断的基础[1]。
详细见:Oracle 等待事件详解。
2. Wait Interface 演进
2.1 7.x 之前
- statspack
- 有限
2.2 7.3+
- v$system_event
- 等待事件
2.3 9i+
- v$session_wait
- 实时
2.4 10g+
- v$session(合并)
- ASH
- Wait Class
2.5 Maclean 观点
- Wait Interface 革命
- 性能诊断基础
- 必学
3. 核心视图
3.1 v$session_wait
SELECT sid, seq#, event, p1text, p1, p2text, p2, p3text, p3, wait_time, seconds_in_wait, state
FROM v$session_wait
WHERE sid = &sid;
3.2 v$session
SELECT sid, event, wait_class, wait_time, seconds_in_wait, state
FROM v$session
WHERE username IS NOT NULL;
3.3 v$system_event
SELECT event, total_waits, time_waited, average_wait
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC;
3.4 v$session_event
SELECT event, total_waits, time_waited
FROM v$session_event
WHERE sid = &sid
ORDER BY time_waited DESC;
4. 状态
4.1 WAITING
- 正在等待
- seconds_in_wait:已等
4.2 WAITED UNKNOWN TIME
- 等过
- 时间未知
4.3 WAITED SHORT TIME
- 等过短时间
- < 1 厘秒
4.4 WAITED KNOWN TIME
- 等过
- wait_time:已等
5. P1/P2/P3
5.1 含义
- 等待事件参数
- 不同事件不同含义
- 定位
5.2 db file sequential read
- P1: file#
- P2: block#
- P3: blocks (1)
5.3 db file scattered read
- P1: file#
- P2: block#
- P3: blocks (多)
5.4 enq: TX - row lock
- P1: name|mode
- P2: usn<<16 | slot
- P3: sequence
5.5 Maclean 分析
- P1/P2/P3 是定位关键
- 不同事件不同
- 查文档
6. Wait Class
6.1 类别
- Administrative
- Application
- Cluster
- Commit
- Concurrency
- Configuration
- Idle
- Network
- Other
- Scheduler
- System I/O
- User I/O
6.2 Maclean 分析
- Idle:忽略
- User I/O:正常
- System I/O:正常
- Concurrency:评估
- Application:评估
6.3 查询
SELECT wait_class, time_waited
FROM v$system_wait_class
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC;
7. Time Model
7.1 DB Time
- DB Time = DB CPU + Wait Time
- 工作时间
7.2 DB CPU
- CPU 时间
- 计算
7.3 关系
- DB Time 高 → 数据库忙
- DB CPU 高 → CPU 密集
- Wait Time 高 → 等待
7.4 Maclean 分析
- DB Time / Wall Time = 平均活跃会话数
- 评估负载
8. 等待事件解读
8.1 db file sequential read
- 索引单块读
- 高:索引扫描多
- 优化:SQL/索引
8.2 db file scattered read
- 全表扫描
- 多块读
- 高:评估
8.3 direct path read
- 直接路径
- 并行/排序
- 评估
8.4 log file sync
- COMMIT 等待
- LGWR
- 优化:Redo
8.5 log file parallel write
- LGWR 写
- 磁盘
- 优化:磁盘
8.6 buffer busy waits
- 块争用
- 热点
- 优化:减少争用
8.7 free buffer waits
- DBWn 慢
- Buffer Cache
- 优化:DBWn/Buffer
8.8 write complete waits
- DBWn 写
- 评估
8.9 enq: TX
- 行锁
- 事务
- 优化:commit
8.10 latch: cache buffers chains
- 热点块
- 优化:减少争用
9. Maclean 诊断流程
9.1 系统级
1. v$system_event TOP
2. Wait Class
3. 关联 SQL
9.2 会话级
1. v$session 活跃
2. v$session_wait
3. P1/P2/P3
4. 定位
9.3 历史
1. AWR
2. ASH
3. 对比
10. 案例:等待分析
10.1 现象
- 系统慢
- 找根因
10.2 Maclean 步骤
-- 1. TOP 等待
SELECT event, time_waited FROM v$system_event
WHERE wait_class != 'Idle' ORDER BY time_waited DESC FETCH FIRST 5 ROWS ONLY;
-- 2. Wait Class
SELECT wait_class, time_waited FROM v$system_wait_class
WHERE wait_class != 'Idle' ORDER BY time_waited DESC;
-- 3. 关联 SQL
SELECT sql_id, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY sql_id ORDER BY count(*) DESC;
10.3 优化
- 等待事件
- SQL
- 优化
- 验证
11. 10046 事件
11.1 启用
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
-- 执行 SQL
ALTER SESSION SET EVENTS '10046 trace name context off';
11.2 分析
tkprof trace.trc trace.txt
11.3 Maclean 推荐
- 单 SQL 诊断
- 详细等待
- tkprof
12. 工具
12.1 内置
- v$ 视图
- AWR
- ASH
- 10046
12.2 Maclean 脚本
- 性能诊断脚本集
- oradb.me
- 社区
13. Maclean 名言
"等待事件是入口"
"理解 P1/P2/P3"
"Wait Interface 是革命"
14. 最佳实践
- Wait Interface:必学
- TOP:聚焦
- P1/P2/P3:定位
- Wait Class:分类
- Time Model:DB Time
- ASH:实时
- AWR:历史
- 10046:单 SQL
- 案例:学习
- 原理:理解
15. 参考资料
[1] Maclean Liu, “Wait Interface”, https://oradb.me [2] Oracle Database Reference 19c [3] Cary Millsap, “Optimizing Oracle Performance”