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

  1. Wait Interface:必学
  2. TOP:聚焦
  3. P1/P2/P3:定位
  4. Wait Class:分类
  5. Time Model:DB Time
  6. ASH:实时
  7. AWR:历史
  8. 10046:单 SQL
  9. 案例:学习
  10. 原理:理解

15. 参考资料

[1] Maclean Liu, “Wait Interface”, https://oradb.me [2] Oracle Database Reference 19c [3] Cary Millsap, “Optimizing Oracle Performance”