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

  1. 关注 Top 5 等待:瓶颈
  2. 区分 Idle 等待:忽略
  3. 结合 SQL:根因
  4. AWR 历史对比:趋势
  5. ASH 实时:定位
  6. 等待类分析:分类
  7. 优化高 Time Waited:效率
  8. 监控 Average Wait:异常
  9. 结合业务:原因
  10. 持续监控:预防

13. 参考资料

[1] Oracle Database Reference 19c, “Wait Events” https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/dynamic-performance-views.html