Oracle 等待事件(Wait Events)
Oracle 等待事件(Wait Events)
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
等待事件(Wait Events) 是性能诊断的核心[1]:
分类:
- I/O 等待
- 锁等待
- 内存等待
- 网络等待
- CPU 等待
2. 查看等待事件
2.1 当前会话
SELECT
event,
total_waits,
time_waited,
average_wait
FROM v$session_wait
WHERE sid = &sid;
2.2 系统级
SELECT
event,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC;
2.3 等待类
SELECT
wait_class,
SUM(time_waited) AS total_time
FROM v$system_event
GROUP BY wait_class
ORDER BY total_time DESC;
3. 常见 I/O 等待
3.1 db file sequential read
含义:单块读(索引访问)。
原因:
- 索引扫描
- 行迁移
- 数据块读取
优化:
-- 1. 检查 SQL 是否用对索引
-- 2. 优化 SQL 减少扫描
-- 3. 数据文件分散 I/O
-- 4. 增大 Buffer Cache
3.2 db file scattered read
含义:多块读(全表扫描)。
原因:
- 全表扫描
- 索引快速全扫描
- 缺少索引
优化:
-- 1. 加索引
-- 2. 优化 SQL
-- 3. 并行
-- 4. 缓存
3.3 db file parallel read
含义:并行读。
优化:
-- 调整 DB_FILE_MULTIBLOCK_READ_COUNT
ALTER SYSTEM SET db_file_multiblock_read_count = 16;
3.4 direct path read
含义:直接路径读(绕过 Buffer Cache)。
原因:
- 并行查询
- 排序溢出
- 大表扫描
4. 锁等待
4.1 enq: TX - row lock contention
含义:行锁竞争。
原因:
- 事务未提交
- 并发更新同列
优化:
-- 1. 缩短事务
-- 2. 加索引减少锁范围
-- 3. NOWAIT/SKIP LOCKED
-- 4. 批量提交
4.2 enq: TM - contention
含义:表锁竞争。
原因:
- 外键无索引
- DDL 操作
优化:
-- 加外键索引
CREATE INDEX idx_emp_dept ON employees(dept_id);
4.3 library cache lock
含义:库缓存锁。
原因:
- DDL 冲突
- 共享池竞争
优化:
-- 1. 减少硬解析
-- 2. 使用绑定变量
-- 3. 共享池大小
5. 内存等待
5.1 library cache pin
含义:库缓存 pin。
原因:
- 共享 SQL 竞争
- DDL 操作
5.2 latch: shared pool
含义:共享池闩锁。
原因:
- 硬解析多
- 共享池小
优化:
-- 1. 使用绑定变量
-- 2. 增大 SHARED_POOL_SIZE
-- 3. 减少硬解析
5.3 latch: cache buffers chains
含义:Buffer Cache 链闩锁。
原因:
- 热点块
- 并发访问
优化:
-- 1. 减少热点块
-- 2. 增加 DB_BLOCK_LRU_LATCHES
-- 3. 优化 SQL
6. 日志等待
6.1 log file sync
含义:日志同步。
原因:
- 提交频繁
- I/O 慢
优化:
-- 1. 批量提交
-- 2. 提高 Redo 日志 I/O
-- 3. 使用 SSD
6.2 log file parallel write
含义:日志并行写。
原因:
- Redo 日志 I/O 慢
优化:
-- 1. Redo 日志单独磁盘
-- 2. 增大 Redo 日志
-- 3. 高性能存储
6.3 log buffer space
含义:日志缓冲区空间不足。
优化:
ALTER SYSTEM SET log_buffer = 64M SCOPE=SPFILE;
7. 网络等待
7.1 SQL*Net message from/to client
含义:客户端通信。
优化:
-- 1. 批量操作
-- 2. 减少往返
-- 3. Array fetch
7.2 SQL*Net more data to client
含义:大数据传输。
优化:
-- 1. 减少数据量
-- 2. SDU 大小
8. CPU 等待
8.1 CPU time
含义:CPU 计算。
原因:
- 复杂 SQL
- 大量解析
- 排序
优化:
-- 1. 优化 SQL
-- 2. 使用绑定变量
-- 3. 加内存减少排序
9. 查看阻塞会话
9.1 阻塞链
SELECT
blocking_session,
sid,
serial#,
username,
event,
seconds_in_wait
FROM v$session
WHERE blocking_session IS NOT NULL;
9.2 锁详情
SELECT
s.sid,
s.username,
l.type,
l.lmode,
l.request,
o.object_name
FROM v$lock l, v$session s, dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND l.type = 'TM';
10. 历史等待
10.1 AWR
SELECT
event_name,
total_waits,
time_waited_micro
FROM dba_hist_system_event
WHERE snap_id BETWEEN 100 AND 110
ORDER BY time_waited_micro DESC;
10.2 ASH
SELECT
sql_id,
event,
COUNT(*)
FROM dba_hist_active_sess_history
WHERE sample_time > SYSDATE - 1
GROUP BY sql_id, event
ORDER BY COUNT(*) DESC;
11. 常见坑与排错
11.1 等待事件不明确
-- 1. 查看 v$session_wait
-- 2. 查看 P1, P2, P3
-- 3. 查看具体 SQL
11.2 间歇性慢
-- 1. ASH 分析
-- 2. AWR 对比
-- 3. 监控长时间会话
11.3 多种等待
-- 按 wait_class 分类
-- 优先处理主要瓶颈
12. 最佳实践
- 关注 Top 5 等待:瓶颈
- 区分 Idle 等待:忽略
- 结合 SQL:根因
- AWR 历史对比:趋势
- ASH 实时:定位
- 等待类分析:分类
- 优化高 Time Waited:效率
- 监控 Average Wait:异常
- 结合业务:原因
- 持续监控:预防
13. 参考资料
[1] Oracle Database Reference 19c, “Wait Events” https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/dynamic-performance-views.html