Oracle Tanel Poder 等待事件深度

Oracle Tanel Poder 等待事件深度

来源:Tanel Poder / tanelpoder.com 适用版本:Oracle Database 9i+ 文档版本:v1.0 / 2026-07-22


1. 概述

Tanel Poder 对等待事件有深度解读[1]。

详细见:Oracle-Maclean-Wait-Interface详解


2. Tanel 等待事件观

2.1 核心

- 等待事件是症状
- 不是根因
- 深入分析

2.2 方法

- 等待事件 + 上下文
- P1/P2/P3 解读
- 内部机制

2.3 工具

- snapper
- ASH
- 等待事件文档

3. 等待事件要素

3.1 基本信息

- Event Name
- Wait Class
- P1/P2/P3
- Wait Time

3.2 P1/P2/P3

- 不同事件不同含义
- 定位关键
- 查文档

3.3 Tanel 强调

- P1/P2/P3 是核心
- 理解每个参数
- 定位

4. db file sequential read

4.1 含义

- 索引单块读
- P1: file#
- P2: block#
- P3: blocks (1)

4.2 定位

SELECT owner, segment_name, segment_type
FROM dba_extents 
WHERE file_id = &p1 AND &p2 BETWEEN block_id AND block_id+blocks-1;

4.3 Tanel 分析

- 索引扫描
- 高:评估 SQL
- 优化

5. db file scattered read

5.1 含义

- 全表/索引快速全扫描
- 多块读
- P1: file#, P2: block#, P3: blocks

5.2 Tanel 分析

- 全表扫描
- 高:评估
- 加索引/分区

6. direct path read

6.1 含义

- 直接路径读
- 绕过 Buffer Cache
- 并行/ASYNCH I/O

6.2 场景

- 并行查询
- 排序溢出
- 11g+ 直接读

6.3 Tanel 分析

- 大表全扫描
- 11g+ 自动
- 评估

7. log file sync

7.1 含义

- COMMIT 等待 LGWR
- P1: buffer

7.2 关联

- log file parallel write(LGWR)
- 区分应用 vs 磁盘

7.3 Tanel 分析

- parallel write 高 → 磁盘
- parallel write 低 → 应用 commit

7.4 优化

- 事务级 commit
- Redo Log 优化
- 评估

8. buffer busy waits

8.1 含义

- 块争用
- 等待 pin
- P1: file#, P2: block#, P3: class#

8.2 class#

- data block:数据块
- segment header:段头
- undo block:Undo
- undo header:Undo 头

8.3 Tanel 分析

- data block:热点
- segment header:并发 INSERT
- 优化

9. enq: TX - row lock

9.1 含义

- 行锁
- P1: name|mode
- P2: usn<<16|slot
- P3: sequence

9.2 解析 P2

- usn = TRUNC(p2 / 65536)
- slot = MOD(p2, 65536)

9.3 Tanel 方法

- 找阻塞者
- 评估
- 优化

10. latch: cache buffers chains

10.1 含义

- 热点块 Latch 争用
- P1: latch addr

10.2 定位

-- Latch → 块
SELECT hladdr FROM x$bh WHERE hladdr = '&p1';

10.3 Tanel 分析

- 热点块
- 高并发
- 反向索引/分区

11. library cache lock/pin

11.1 含义

- Library Cache 争用
- lock:编译
- pin:执行

11.2 P1/P2/P3

- P1: handle address
- P2: pin address
- P3: mode

11.3 Tanel 分析

- DDL 冲突
- 绑定变量
- 共享池

12. read by other session

12.1 含义

- 其他会话在读
- 物理读争用

12.2 Tanel 分析

- 多会话同块
- Buffer Cache 不足
- 评估

13. free buffer waits

13.1 含义

- 等待空闲 Buffer
- DBWn 慢

13.2 Tanel 分析

- DBWn 跟不上
- Buffer Cache 不足
- 评估

14. Tanel 诊断流程

14.1 步骤

1. 等待事件 TOP
2. P1/P2/P3
3. 定位对象
4. 内部机制
5. 根因
6. 优化

14.2 工具

- snapper:实时
- ASH:历史
- latchprof:Latch
- v$ 视图

14.3 深度

- 不止于事件名
- 理解机制
- 定位根因

15. 案例

15.1 案例:db file scattered read

- 全表扫描
- P1/P2/P3 → 对象
- 加索引

15.2 案例:log file sync

- 区分应用 vs 磁盘
- parallel write
- 优化

15.3 案例:latch 争用

- Latch → 块 → 对象
- 热点
- 反向索引

16. Tanel 名言

"Wait events are symptoms, not causes"
"Know your wait events"
"P1/P2/P3 matters"

17. 学习资源

17.1 博客

- tanelpoder.com
- 系列文章
- 深度

17.2 培训

- Advanced Oracle Troubleshooting
- 实战

17.3 TPT

- GitHub
- 开源
- 脚本

18. 最佳实践

  1. P1/P2/P3:理解
  2. 定位对象:dba_extents
  3. 内部机制:深入
  4. snapper:实时
  5. ASH:历史
  6. 根因:分析
  7. 案例:学习
  8. 工具:TPT
  9. 监控:持续
  10. 原理:理解

19. 参考资料

[1] Tanel Poder, “Wait Events Deep Dive”, https://tanelpoder.com [2] Oracle Database Reference 19c