Oracle 等待事件与处理策略
Oracle 等待事件与处理策略
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
本文档汇总常见等待事件及处理策略[1]:
详细见:Oracle 等待事件 Wait Events 和 Oracle 数据库等待事件详解。
2. I/O 等待
2.1 db file sequential read
含义:索引单块读
优化:
- 减少索引扫描
- 优化 SQL
- 索引精简
2.2 db file scattered read
含义:多块全表扫描
优化:
- 加索引
- 分区裁剪
- 并行
2.3 direct path read
含义:直接路径读(并行、ASMM)
优化:
- 减少 I/O
- 并行优化
2.4 direct path write
含义:直接路径写
优化:
- 减少 I/O
- 排序优化
3. Redo 等待
3.1 log file sync
含义:提交等待 LGWR
优化:
- 减少提交频率
- Redo SSD
- Redo 多成员
3.2 log file parallel write
含义:LGWR 写 Redo
优化:
- Redo SSD
- Redo 分组
3.3 log buffer space
含义:Redo Buffer 满
优化:
- 增大 log_buffer
- 优化 Redo
4. Buffer 等待
4.1 buffer busy wait
含义:块争用
优化:
- 减少热点
- INITRANS
- 分区
4.2 free buffer waits
含义:等待空闲 Buffer
优化:
- 增大 Buffer Cache
- 增加 DBWn
- 优化 I/O
4.3 write complete waits
含义:等待 DBWn 写完
优化:
- 增大 Buffer Cache
- 增加 DBWn
- 减少 I/O
5. 锁等待
5.1 enq: TX - row lock contention
含义:行锁
优化:
- 及时提交
- 优化事务顺序
5.2 enq: TM - contention
含义:表锁
优化:
- 减少 DDL
- 优化 DML
5.3 enq: TX - allocate ITL entry
含义:ITL 不足
优化:
- INITRANS
- PCTFREE
- 重建表
6. Latch 等待
6.1 latch: cache buffers chains
含义:块链表争用
优化:
- 减少热点块
- 反向索引
- 分区
6.2 latch: shared pool
含义:共享池争用
优化:
- 绑定变量
- 减少 SQL
- 增大 Shared Pool
6.3 latch: library cache
含义:库缓存争用
优化:
- 绑定变量
- 共享游标
7. Mutex 等待
7.1 cursor: pin S
含义:游标共享 pin
优化:
- 减少并发
- 共享游标
7.2 library cache: mutex X
含义:库缓存互斥
优化:
- 减少硬解析
- 绑定变量
8. RAC 等待
8.1 gc cr block 2-way/3-way
含义:Cache Fusion
优化:
- 服务分离
- 序列 NOORDER
- 减少跨节点
8.2 gc buffer busy
含义:Buffer 争用
优化:
- 减少跨节点访问
- 分区
9. 网络等待
9.1 SQL*Net message from client
含义:等待客户端(Idle)
优化:
- 应用响应快
9.2 SQL*Net more data to client
含义:大量数据传输
优化:
- 增大 SDU
- Array Fetch
10. Application 等待
10.1 enq: UL - contention
含义:用户锁
10.2 PX Deq: Execute Reply
含义:并行等待
优化:
- 并行优化
11. 处理策略
11.1 系统级
-- 1. Top 5 等待
SELECT event, total_waits, time_waited
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC
FETCH FIRST 5 ROWS ONLY;
-- 2. 等待类
SELECT wait_class, SUM(time_waited)
FROM v$system_event
WHERE wait_class != 'Idle'
GROUP BY wait_class
ORDER BY 2 DESC;
11.2 会话级
SELECT
sid,
event,
wait_class,
seconds_in_wait,
sql_id
FROM v$session
WHERE status = 'ACTIVE'
AND event NOT LIKE 'SQL*Net%';
11.3 ASH
SELECT
event,
COUNT(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/24
GROUP BY event
ORDER BY samples DESC;
12. 等待分类总结
| 类别 | 等待事件 | 优化方向 |
|---|---|---|
| User I/O | db file * read | 索引、I/O |
| System I/O | log file * write | Redo |
| Application | enq: TX | 锁、事务 |
| Concurrency | latch、mutex | 解析、热点 |
| Commit | log file sync | 提交 |
| Network | SQL*Net | 网络 |
| Idle | client、timer | 正常 |
13. 常见坑与排错
13.1 误判
- Idle 当问题
- 多个等待叠加
- 根因未找
13.2 过度优化
- 单点优化
- 忽略整体
- 副作用
14. 最佳实践
- Top 5 优先:瓶颈
- 分类诊断:精准
- ASH 实时:定位
- AWR 历史:趋势
- 基线对比:异常
- 根因分析:彻底
- 小步优化:可验证
- 监控告警:及时
- 持续监控:循环
- 文档化:积累
15. 参考资料
[1] Oracle Database Reference 19c, “Wait Events” https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/