作者: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 的等待事件主要分为两类:
-
空闲等待事件 (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# 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 相关的几个视图
1.6
V$SYSTEM_EVENT 视图
二.33个常见的等待事件
1. Buffer busy waits
2. Buffer latch
3. Control file parallel write
4. Control file sequential read
5. Db file parallel read
6. Db file parallel write
7. Db file scattered read
8. Db file sequential read
9. Db file single write
10. Direct path read
11. Direct path write
12. Enqueue
13. Free buffer waits
14. Latch free
15. Library cache lock
16. Library cache pin
17. Log file parallel write
18. Log buffer space
19. Log file sequential read
20. Log file single write
21. Log file sync
22. OS Thread Wait
23. PX Deq: Execution Msg
24. PX Deq: Table Q Normal
25. PX Deq: Table Q Skipped
26. Query Timeouts
27. SQL*Net Break/reset to client
28. SQL*Net message from client
29. SQL*Net message to client
30. SQL*Net more data to client
31. Stream buffer wait
32. Transaction rollback
33. Undo Segment Space Waits
三.如何优化等待事件
针对上述各种等待事件,数据库管理员可以通过以下几种方法来减少和优化等待事件,从而提高数据库性能:
1. 优化 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 语句优化和并发管理,可以有效地减少等待事件,提升数据库的响应速度和吞吐量。定期的性能监控和调整将确保数据库在高并发、大负载的环境下保持稳定的性能。
