等待事件由来:
以命中率为主要参考指标-->以等待事件为主要参考指标/以时间模型为主要参考指标
等待事件为了解决以命中率为指标的诸多弊端。与时间模型相比,等待事件以更加直观、细粒度的方式观察Oracle的行为,往往作为优化的重要入口。而时间模型,更侧重于整体、系统性的了解数据库运行状态。
等待事件分类
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> 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 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.
空闲与非空闲等待事件:
空闲等待事件,是指Oracle正等待某种工作,比如用sqlplus登录之后,但没有进一步发出任何命令,此时该session就处于SQL*Net message from/to client等待事件状态,等待用户发出命令,任何的在诊断和优化数据库的时候,一般不用过多注意这部分事件。
非空闲等待事件,专门针对Oracle的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是调整数据库的时候应该关注与研究的。
等待事件是什么?
每一个等待事件,都表明数据库的一种活动状态。从上面的查询可见,系统内置了很多等待事件,可以通过数据字典V$EVENT_NAME去了解每个等待事件。
相关视图
v$event_name 系统支持的等待事件,可以查看等待事件所属类别、参数的含义等信息。
v$system_wait_class 等待事件类别的统计信息(系统级)。通过这一视图,可从全局角度了解系统那类操作等待较多。
v$system_event 等待事件的统计信息(系统级)。展开来说,是提供了自实例启动后各个等待事件的概括。常用于获取系统等待信息的历史影象。而通过两个snapshot获取等待项增量,则可以确定这段时间内系统的等待项。
v$session_event 和v$system_event相类似,记录的是会话在其生命周期中各个等待事件的累计值。跟前者相比,增加了session_id信息。这些信息也会被同时累积到v$system_event中。需要注意的是,当一个会话重新建立时,统计信息将被设置为0。
v$session_wait、v$session 活动会话正在等待的资源或事件信息。V$SESSION_EVENT提供了累积的但不是非常详细的数据。可以通过历史视图v$session_wait_history获得历史信息。
v$session_wait_history 记录会话最近n次等待事件,即v$session_wait的历史记录。默认是记录10次,可进行修改。
v$event_histogram 这个视图记录了等待事件的柱状图分布,从而可以对一个等待事件具体分布有进一步了解。在v$session_event或v$system_event视图记录的是累积信息以及关于等待的平均值,无法得知个别等待消耗的时间。
会话等待事件与各视图之间的关系
-
.一个会话一次只发生一个等待事件。如果看到了其他的等待事件,那仅仅表示在下一个时间片上发生了等待。在某个时刻只存在一个等待。
-
v$session_wait中的wait_time和second_in_wait字段以秒为单位,而v$session_event中的time_waited和average_wait字段是以百分之一秒为单位。
-
v$session_wait的等待事件结束后,v$session_event的统计信息将会发生改变。
-
v$session_wait的统计信息意义不大,因为信息是实时变化的。
-
当v$session_wait里面的等待事件结束时,v$session_wait中的seconds_in_wait字段值被复制到v$session_event中time_waited字段,而v$session_event视图的average_time字段同时也被修改。