当前位置: 首页 > news >正文

Oracle 常见的33个等待事件

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

一.等待事件的相关知识

1.1 等待事件分类

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

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

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

    • db file scattered read
    • db file sequential read
    • buffer busy waits
    • free buffer waits
    • enqueue
    • latch free
    • log file parallel write
    • log file sync

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

SQL> desc v$event_name;名称                  是否为空?    类型
-------------------------------
EVENT#               NUMBER
EVENT_ID             NUMBER
NAME                 VARCHAR2(64)
PARAMETER1           VARCHAR2(64)
PARAMETER2           VARCHAR2(64)
PARAMETER3           VARCHAR2(64)
WAIT_CLASS_ID        NUMBER
WAIT_CLASS#          NUMBER
WAIT_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_name
GROUP BY wait_class#, wait_class_id, wait_class
ORDER BY wait_class#;

查询结果:

WAIT_CLASS# WAIT_CLASS_ID WAIT_CLASS        count
----------- ------------- -------------------- ----------0    1893977003 Other                    7171    4217450380 Application               172    3290255840 Configuration             243    4166625743 Administrative            544    3875070507 Concurrency               325    3386400367 Commit                    26    2723168908 Idle                     947    2000153315 Network                  358    1740759767 User I/O                 459    4108307767 System I/O               3010    2396326234 Scheduler                711    3871361733 Cluster                  5012     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 readdb file scattered readlog file parallel write 等等待事件。

2. 调整缓冲区配置

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

3. 减少锁等待

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

4. 并行执行优化

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

5. 网络优化

  • 确保网络带宽和连接稳定性良好,避免因网络问题导致的 SQL*Net message from clientSQL*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 语句优化和并发管理,可以有效地减少等待事件,提升数据库的响应速度和吞吐量。定期的性能监控和调整将确保数据库在高并发、大负载的环境下保持稳定的性能。

http://www.dtcms.com/a/503209.html

相关文章:

  • 比特位计数(二)
  • Linux网络HTTP(中)(8)
  • wordpress老站开启多站点wordpress评论是关闭还是开启
  • 建设宣传网站上的请示邯郸网站建设哪能做
  • Linux 例行性工作任务(定时任务)知识点总结
  • 一文学会大模型开发Eino框架的模型调用方法
  • Docker命令大全:从入门到精通
  • 沈阳网站制作公司思路留学网站建设
  • js封装一个双精度算法实现
  • 性能优化:提升软件效率的实用指南
  • 【FPGA】设计流程——Veriolg输入
  • 公共交通安全再讨论
  • C++蓝桥杯之结构体10.15
  • 从原理到实战:Java 队列(Queue)指南
  • 【C++】用红黑树封装map与set
  • php网络公司网站源码网站建设与管理的体会
  • 做网站要先申请域名吗做彩铃的网站
  • 零基础做地方门户网站装修网名大全
  • Docker入门手册
  • 谷歌 Gemini 2.5 Flash Image 震撼升级图像编辑
  • Spring Boot 3零基础教程,WEB 开发 整合 Thymeleaf 笔记36
  • [go 面试] 并发与数据一致性:事务的保障
  • gitee——代码托管平台(进行托管所需的相关软件)
  • JavaWeb后端-Maven、单元测试
  • 微网站后台怎么注册有哪些公众号是小黄油的
  • 【SayCan】LLM+价值函数:以言为引,量力而行
  • 做亚马逊外国网站需要语言好吗大都会app约
  • DaVinci4.2.3 | 无限次AI图片生成,可以预制多种风格,提示限制清理数据重新进即可
  • Linux 配置双栈协议(IPv4 + IPv6)详解
  • JAVA全栈JVM篇————初识JVM