Oracle常见等待事件说明

网络整理 - 07-26
Oracle的等待事件是衡量Oracle运行状况的重要依据及指标。等待事件的概念是在Oracle7.0.1.2中引入的,大致有100个等待事件。在Oracle 8.0中这个数目增加到了大约150个,在Oracle8i中大约有200个事件,在Oracle9i中大约有360个等待事件。主要有两种类别的等待事件,即空闲(idle)等待事件和非空闲(non-idle)等待事件。

  空闲事件指Oracle正等待某种工作,在诊断和优化数据库的时候,我们不用过多注意这部分事件。

  常见的空闲事件有:

  • dispatcher timer

  • lock element cleanup

  • Null event

  • parallel query dequeue wait

  • parallel query idle wait - Slaves

  • pipe get

  • PL/SQL lock timer

  • pmon timer- pmon

  • 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

  非空闲等待事件专门针对Oracle的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是我们在调整数据库的时候应该关注与研究的。

  一些常见的非空闲等待事件有:

  • 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. db file scattered read-DB 文件分散读取

  这种情况通常显示与全表扫描相关的等待。当数据库进行全表扫时,基于性能的考虑,数据会分散(scattered)读入Buffer Cache。如果这个等待事件比较显著,可能说明对于某些全表扫描的表,没有创建索引或者没有创建合适的索引,我们可能需要检查这些数据表已确定是否进行了正确的设置。

  然而这个等待事件不一定意味着性能低下,在某些条件下Oracle 会主动使用全表扫描来替换索引扫描以提高性能,这和访问的数据量有关,在CBO 下Oracle 会进行更为智能的选择,在RBO 下Oracle 更倾向于使用索引。

  因为全表扫描被置于LRU(Least Recently Used,最近最少适用)列表的冷端(cold end),对于频繁访问的较小的数据表,可以选择把他们Cache 到内存中,以避免反复读取。

  当这个等待事件比较显著时,可以结合v$session_longops 动态性能视图来进行诊断,该视图中记录了长时间(运行时间超过6 秒的)运行的事物,可能很多是全表扫描操作(不管怎样,这部分信息都是值得我们注意的)。