Oracle 常见的33个等待事件
本篇文章将详细介绍 Oracle 数据库中常见的等待事件及其优化方法,涵盖了 I/O 性能、锁等待、并行执行、事务管理等方面的内容。通过对这些事件的分析和优化,DBA 能够更好地识别并解决数据库的性能瓶颈,确保数据库在高并发、大数据量的环境下稳定高效地运行。
一.等待事件的相关知识
1.1 等待事件分类
Oracle 的等待事件主要分为两类:
-
空闲等待事件 (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
-
非空闲等待事件 (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 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 语句优化和并发管理,可以有效地减少等待事件,提升数据库的响应速度和吞吐量。定期的性能监控和调整将确保数据库在高并发、大负载的环境下保持稳定的性能。