Oracle 常见的33个等待事件

来源:这里教程网 时间:2026-03-03 22:46:42 作者:

作者:Digital Observer(施嘉伟) Oracle  ACE Pro: Database PostgreSQL  ACE Partner 11年数据库行业经验,现主要从事数据库服务工作 拥有Oracle  OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、 PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证 ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师 公众号:Digital Observer;CSDN:施嘉伟;ITPUB:sjw1933;墨天轮:Digital Observer;PGFans:施嘉伟。

本篇文章将详细介绍 Oracle 数据库中常见的等待事件及其优化方法,涵盖了 I/O 性能、锁等待、并行执行、事务管理等方面的内容。通过对这些事件的分析和优化,DBA 能够更好地识别并解决数据库的性能瓶颈,确保数据库在高并发、大数据量的环境下稳定高效地运行。

一.等待事件的相关知识

1.1 等待事件分类

Oracle 的等待事件主要分为两类:

  1. 空闲等待事件 (Idle) 空闲等待事件通常不需要特别关注,它们表示数据库正等待某些非关键操作。常见的空闲等待事件有:

  2. dispatcher timer
  3. lock element cleanup
  4. Null event
  5. parallel query dequeue wait
  6. parallel query idle wait - Slaves
  7. pipe get
  8. PL/SQL lock timer
  9. pmon timer
  10. rdbms ipc message
  11. slave wait
  12. smon timer
  13. SQL*Net break/reset to client
  14. SQL*Net message from client
  15. SQL*Net message to client
  16. SQL*Net more data to client
  17. virtual circuit status
  18. client message
  19. 非空闲等待事件 (Non-IDLE) 非空闲等待事件通常是重要的,表示数据库在执行查询、事务等时的资源等待。常见的非空闲等待事件有:

  20. db file scattered read
  21. db file sequential read
  22. buffer busy waits
  23. free buffer waits
  24. enqueue
  25. latch free
  26. log file parallel write
  27. log file sync

1.2 查看  v$event_name 视图的字段结构

SQL> desc v$event_name;
名称                  是否为空?    类型-------------------------------EVENT#               NUMBEREVENT_ID             NUMBER
NAME                 VARCHAR2(64)
PARAMETER1           VARCHAR2(64)
PARAMETER2           VARCHAR2(64)
PARAMETER3           VARCHAR2(64)
WAIT_CLASS_ID        NUMBER
WAIT_CLASS#          NUMBERWAIT_CLASS           VARCHAR2(64)

1.3 查看等待事件总数

SQL> select count(*) from v$event_name;
COUNT(*)----------
     1116

1.4 查看等待事件分类情况

SELECT   wait_class#,
         wait_class_id,
         wait_class,         COUNT(*) AS "count"FROM   v$event_nameGROUP BY wait_class#, wait_class_id, wait_classORDER BY wait_class#;

查询结果:

WAIT_CLASS# WAIT_CLASS_ID WAIT_CLASS        count
----------- ------------- -------------------- ----------
          0    1893977003 Other                    717
          1    4217450380 Application               17
          2    3290255840 Configuration             24
          3    4166625743 Administrative            54
          4    3875070507 Concurrency               32
          5    3386400367 Commit                    2
          6    2723168908 Idle                     94
          7    2000153315 Network                  35
          8    1740759767 User I/O                 45
          9    4108307767 System I/O               30
         10    2396326234 Scheduler                7
         11    3871361733 Cluster                  50
         12     644977587 Queueing                  9

1.5 相关的几个视图

  • V$SESSION:代表数据库活动的开始,视为源起。
  • V$SESSION_WAIT:实时记录活动 SESSION 的等待情况。
  • V$SESSION_WAIT_HISTORY:增强的 V$SESSION_WAIT,记录活动 SESSION 的最近 10 次等待。
  • V$SQLTEXT:用于捕获正在执行的 SQL 语句。
  • V$ACTIVE_SESSION_HISTORY:记录活动 SESSION 的历史等待信息,每秒采样一次。
  • DBA_HIST_ACTIVE_SESS_HISTORY:历史数据的访问视图。

    1.6  V$SYSTEM_EVENT 视图

  • 记录数据库自启动以来所有等待事件的汇总信息。

    二.33个常见的等待事件

    1.  Buffer busy waits

  • 发生原因:当一个会话试图修改一个数据块,而该数据块正在被另一个会话修改时,或者数据块正在被读取时,可能会发生此等待事件。
  • 常见解决方法:缓解热点块问题,增加内存。

    2.  Buffer latch

  • 发生原因:内存中数据块存放位置的哈希列表需要使用 latch 来保护。会话需要访问该列表时,会产生此等待事件。
  • 常见解决方法:使用多个 buffer pool 来创建更多的 buffer chains。

    3.  Control file parallel write

  • 发生原因:多个控制文件拷贝之间的写入同步问题。
  • 常见解决方法:减少控制文件的拷贝数量,或者将其分布在不同的物理磁盘上。

    4.  Control file sequential read

  • 发生原因:读取控制文件时,特别是在备份控制文件或 RAC 环境中。
  • 常见解决方法:优化控制文件访问策略。

    5.  Db file parallel read

  • 发生原因:数据库恢复时读取数据文件中的数据块。
  • 常见解决方法:检查 I/O 性能和数据库恢复策略。

    6.  Db file parallel write

  • 发生原因:DBWR 进程将脏数据写入磁盘。
  • 常见解决方法:启用操作系统的异步 I/O 来减少等待。

    7.  Db file scattered read

  • 发生原因:全表扫描或快速索引扫描时,数据库顺序读取多个数据块。
  • 常见解决方法:优化查询方式,减少全表扫描。

    8.  Db file sequential read

  • 发生原因:通常在索引访问、回滚操作时发生。
  • 常见解决方法:优化索引使用,减少不必要的 I/O 操作。

    9.  Db file single write

  • 发生原因:更新数据文件头信息时发生此等待事件。
  • 常见解决方法:优化数据文件的管理和文件数量。

    10.  Direct path read

  • 发生原因:会话将数据块直接读取到 PGA 中,通常是来自临时段。
  • 常见解决方法:检查 PGA 空间配置,优化临时表空间使用。

    11.  Direct path write

  • 发生原因:会话将数据从 PGA 写入磁盘,而不经过 SGA。
  • 常见解决方法:增加 PGA 空间配置,优化临时数据存储。

    12.  Enqueue

  • 发生原因:会话正在等待特定锁定资源。
  • 常见解决方法:分析 AWR 报告中的 Enqueue Activity,优化锁定策略。

    13.  Free buffer waits

  • 发生原因:内存中没有足够的空间来存放新的数据块。
  • 常见解决方法:增加缓冲区大小,优化 DBWR 进程的工作。

    14.  Latch free

  • 发生原因:会话等待获取 Latch 锁。
  • 常见解决方法:优化内存访问策略,减少 latch 争用。

    15.  Library cache lock

  • 发生原因:共享池中多个用户并发操作同一数据库对象时产生。
  • 常见解决方法:优化数据库对象的使用,减少并发 DDL 操作。

    16.  Library cache pin

  • 发生原因:Oracle 对 PL/SQL 或视图等对象重新编译时产生。
  • 常见解决方法:优化共享池的使用,减少对象的频繁编译。

    17.  Log file parallel write

  • 发生原因:LGWR 进程将 redo log 写入磁盘时,可能由于磁盘 I/O 性能不足而引起此事件。
  • 常见解决方法:优化 I/O 性能,确保 redo log 分布合理。

    18.  Log buffer space

  • 发生原因:log buffer 没有足够空间存放新的 redo log 数据。
  • 常见解决方法:增加 redo buffer 大小,优化磁盘 I/O 性能。

    19.  Log file sequential read

  • 发生原因:归档进程读取 redo log 信息时发生。
  • 常见解决方法:优化 redo log 存储策略,提高磁盘 I/O 性能。

    20.  Log file single write

  • 发生原因:更新 redo log 文件头信息时发生此等待事件。
  • 常见解决方法:检查 redo log 文件分布,确保写入效率。 继续生成等待事件相关的内容:

    21.  Log file sync

  • 发生原因:当数据库正在进行事务提交操作时,会出现此事件。它表示日志缓冲区的数据需要写入磁盘以确保事务的持久性。
  • 常见解决方法:增加磁盘的 I/O 性能,优化事务提交过程,减少同步提交。

    22.  OS Thread Wait

  • 发生原因:操作系统级的线程等待,可能是由于线程切换或 I/O 操作等引起的。
  • 常见解决方法:优化系统的线程管理,确保操作系统的资源分配合理。

    23.  PX Deq: Execution Msg

  • 发生原因:Parallel Execution (PX) 在执行 SQL 语句时,子任务之间的通信延迟。
  • 常见解决方法:增加 parallel servers 配置,优化 parallel execution 的使用,减少网络延迟。

    24.  PX Deq: Table Q Normal

  • 发生原因:Parallel Execution 进程在执行数据查询操作时等待数据。
  • 常见解决方法:优化并行查询的配置,确保数据库能有效处理大量并发查询。

    25.  PX Deq: Table Q Skipped

  • 发生原因:并行查询过程中有部分查询任务被跳过,通常与并行查询的负载均衡问题有关。
  • 常见解决方法:优化并行查询的配置,确保查询操作被均衡分配。

    26.  Query Timeouts

  • 发生原因:查询因执行时间过长而超时。这可能与查询计划不当、数据量过大或资源不足有关。
  • 常见解决方法:优化查询语句、索引,检查数据库负载,确保查询能够尽可能高效地执行。

    27.  SQL*Net Break/reset to client

  • 发生原因:当客户端和服务器之间的网络连接因故障或中断而被重置时,可能会触发此事件。
  • 常见解决方法:检查网络连接的稳定性,确认没有网络故障导致连接断开。

    28.  SQL*Net message from client

  • 发生原因:服务器正在等待来自客户端的 SQL*Net 请求信息。
  • 常见解决方法:优化客户端与服务器的交互,减少不必要的网络请求延迟。

    29.  SQL*Net message to client

  • 发生原因:服务器正在等待将响应发送到客户端。
  • 常见解决方法:确保网络通信畅通无阻,并优化查询结果返回速度。

    30.  SQL*Net more data to client

  • 发生原因:服务器正在等待传输大量数据给客户端,通常发生在查询返回大量数据时。
  • 常见解决方法:考虑分页查询或限制返回的数据量,减少每次传输的数据量。

    31.  Stream buffer wait

  • 发生原因:流缓冲区等待写入数据到日志文件或磁盘上,通常在使用流复制时出现。
  • 常见解决方法:确保流缓冲区有足够的空间,优化数据流的处理过程。

    32.  Transaction rollback

  • 发生原因:在事务回滚时,Oracle 需要将之前操作的数据恢复到原始状态,回滚操作可能会涉及大量 I/O 操作。
  • 常见解决方法:减少事务的大小,避免长时间的事务处理,确保回滚操作尽可能高效。

    33.  Undo Segment Space Waits

  • 发生原因:在进行事务处理时,Oracle 需要使用回滚段来管理事务的原子性,如果回滚段空间不足,就会导致此等待事件。
  • 常见解决方法:增加回滚段空间,优化事务的大小和频率。

    三.如何优化等待事件

    针对上述各种等待事件,数据库管理员可以通过以下几种方法来减少和优化等待事件,从而提高数据库性能:

    1.  优化 I/O 性能

  • 增加磁盘的带宽和吞吐量,确保数据库 I/O 操作能够尽快完成,避免如  db file sequential read、 db file scattered read、 log file parallel write 等等待事件。

    2.  调整缓冲区配置

  • 根据数据库负载和性能监控结果,增加或调整内存缓冲区(如 DB_CACHE_SIZE、SHARED_POOL_SIZE 等)大小,减少  buffer busy waits 等等待事件。

    3.  减少锁等待

  • 通过优化 SQL 语句、减少对同一数据的并发访问来减少  enqueue、 latch free 等锁等待事件。

    4.  并行执行优化

  • 通过合理配置并行执行参数(如  PARALLEL_MAX_SERVERS),减少  PX Deq 等与并行执行相关的等待事件。

    5.  网络优化

  • 确保网络带宽和连接稳定性良好,避免因网络问题导致的  SQL*Net message from client 和  SQL*Net break/reset to client 等等待事件。

    6.  优化事务

  • 减少长时间运行的事务,避免大量回滚操作,减少  transaction rollback 等等待事件。

    7.  合理设计索引

  • 创建合理的索引结构,以减少全表扫描等操作,从而减少  db file scattered read 等等待事件。

    8.  合适的回滚段空间配置

  • 增加回滚段的大小,减少事务对回滚段的等待,避免  undo segment space waits 等事件。

    9.  监控和调优

  • 定期查看 AWR(Automatic Workload Repository)报告、ASH(Active Session History)报告等工具,找到数据库瓶颈,并针对性地进行调整。

    四.总结

    优化 Oracle 数据库的性能涉及多方面的工作,其中等待事件的分析是最关键的一环。通过合理配置硬件、数据库参数、SQL 语句优化和并发管理,可以有效地减少等待事件,提升数据库的响应速度和吞吐量。定期的性能监控和调整将确保数据库在高并发、大负载的环境下保持稳定的性能。

    hhh6.jpg

  • 相关推荐