Oracle数据库等待事件是7i开始引入的概念,是性能优化和故障诊断的重要依据。按服务器进程或线程递增的统计信息,指示必须等待事件完成之后才能继续处理。等待事件数据显示了可能会影响性能的问题的各种症状,如闩锁争用、缓冲区争用和I/O 争用。这些只是问题的症状,而不是实际的原因。等待事件按类别进行分组。等待事件的类别包括:管理、应用程序、簇、提交、并发、配置、空闲、网络、其它、调度程序、系统 I/O 和用户 I/O。 Oracle19c数据库中大约有1920多个等待事件,包括"free buffer wait(空闲缓冲区等待"、"latch free(闩锁释放)"、"buffer busy waits(缓冲区忙等待)"、"db file sequential read(数据库文件顺序读取"和"db file scattered read(数据库文件分散读取)"。 不同版本的等待事件数量不一样,但是都可以通过v$event_name视图来查询等待事件
SQL> select BANNER_FULL from v$version; BANNER_FULL -------------------------------------------------------------------------------- Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> SQL> desc v$event_name Name Null? Type ----------------------------------------- -------- ---------------------------- 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) DISPLAY_NAME VARCHAR2(64) CON_ID NUMBER SQL>
注: PARAMETER1, PARAMETER2, PARAMETER3对每个等待事件的值都是不一样的。 在cdb的根容器中查询等待事件数量
SQL> select count(*) from v$event_name; COUNT(*) ---------- 1920
在pdb中查询等待事件数量
SQL> select count(*) from v$event_name; COUNT(*) ---------- 1920 SQL>
通过v$fixed_view_definition视图查看GV$EVENT_NAME的定义
SQL> SELECT view_definition FROM v$fixed_view_definition 2 WHERE view_name='GV$EVENT_NAME'; VIEW_DEFINITION -------------------------------------------------------------------------------- select inst_id, indx, ksledhash, kslednam, ksledp1, ksledp2, ksledp3, ksledclas sid, ksledclass#, ksledclass, ksleddsp, con_id from x$ksled SQL>
x$ksled基表是记录等待事件的描述 [E]vent Waits X$KSLED - Event [D]escriptors 查询等待事件分类
SQL> select distinct WAIT_CLASS from v$event_name; WAIT_CLASS ---------------------------------------------------------------- System I/O Scheduler Network Application Other User I/O Administrative Commit Queueing Concurrency Idle Cluster Configuration 13 rows selected.
等待事件说明 Idle 空闲 User I/O 用户I/O System I/O 系统I/O Network 网络等待 Application 应用等待 Concurrency 并发等待 Commit 提交等待 Cluster 集群等待 Administrative 管理等待 Other 其他等待 Configuration 配置等待 Scheduler 排期等待 Queueing 队列等待 19c中各类等待事件的个数
SQL> 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#; 2 3 WAIT_CLASS# WAIT_CLASS_ID WAIT_CLASS count ------------- ------------- ------------------------------ ---------- 0 1893977003 Other 1394 1 4217450380 Application 17 2 3290255840 Configuration 28 3 4166625743 Administrative 59 4 3875070507 Concurrency 56 5 3386400367 Commit 5 6 2723168908 Idle 140 7 2000153315 Network 30 8 1740759767 User I/O 59 9 4108307767 System I/O 40 10 2396326234 Scheduler 10 11 3871361733 Cluster 73 12 644977587 Queueing 9 13 rows selected. SQL>
AWR报告中也记录了等待事件
AWR中的顶级等待事件
从上面我们可以看出Oracle的等待事件份两大类:空闲(IDEL)和非空闲(NON-IDLE)。
空闲(IDEL)类的等待事件故障诊断和性能分析时可以忽略。非空闲
(NON-IDLE)的等待事件时针对数据库的任务或应用执行SQL等动作时发生的等待,这些等待事件对我们很重要。
-the end-
