想必大家都知道Oracle的等待时间分为两种,一种我们称之为“空闲等待事件”,另外一种称之为“非空闲等待事件”。
“空闲等待事件”——作为DBA可以不用过分的关注这类等待事件。
“非空闲等待事件”——当DBA发现这一类的等待事件的时候,就要提高警惕了,因为这一类的等待事件出现后,往往说明应用程序出现了不应该有的等待问题,需要逐一的排查。
得到等待事件的动态性能视图是v$session_wait,不过要快速的排除“空闲等待事件”得到我们关心的等待事件该如何做呢?
这里给出我想到的三种方法。
这里演示的数据库版本是Oracle 10.2.0.3
sys@ora10g> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
1.第一种方法
如果数据库中我们部署过statspack,那我们会得到一个比较有趣的视图perfstat.stats$idle_event,这个视图汇总了所有的空闲等待事件,我们排除这个视图中的内容后就可以得到我们关心的内容了。
脚本如下:
select sid,p1,p1raw,p2,p2raw,p3,p3raw,wait_time,seconds_in_wait,state,event
from v$session_wait
where event not in (select event from perfstat.stats$idle_event)
2.第二种方法
如果没有部署statspack,可以通过系统的另外一个视图得到近似的空闲等待事件的列表,这个视图就是v$event_name,当wait_class字段为“Idle”时,就可以得到空闲等待事件。
脚本如下:
select sid,p1,p1raw,p2,p2raw,p3,p3raw,wait_time,seconds_in_wait,state,event
from v$session_wait
where event not in (select name from v$event_name where wait_class='Idle')
;
3.第三种方法
这种方法是比较“笨”的方法,不过也非常的有效,就是将我们知道的空闲等待事件统统的列到脚本里。
脚本如下:
select sid,p1,p1raw,p2,p2raw,p3,p3raw,wait_time,seconds_in_wait,state,event
from v$session_wait
where event not in (
'AQ Proxy Cleanup Wait',
'ASM background timer',
'DIAG idle wait',
'EMON idle wait',
'KSV master wait',
'LNS ASYNC archive log',
'LNS ASYNC dest activation',
'LNS ASYNC end of log',
'LogMiner: client waiting for transaction',
'LogMiner: slave waiting for activate message',
'LogMiner: wakeup event for builder',
'LogMiner: wakeup event for preparer',
'LogMiner: wakeup event for reader',
'Null event',
'PX Deq Credit: need buffer',
'PX Deq Credit: send blkd',
'PX Deq: Execute Reply',
'PX Deq: Execution Msg',
'PX Deq: Par Recov Execute',
'PX Deq: Signal ACK',
'PX Deq: Table Q Normal',
'PX Deq: Table Q Sample',
'PX Deque wait',
'PX Idle Wait',
'Queue Monitor Shutdown Wait',
'Queue Monitor Slave Wait',
'Queue Monitor Wait',
'SQL*Net message from client',
'SQL*Net message to client',
'SQL*Net more data from client',
'STREAMS apply coord waiting for slave message',
'STREAMS apply slave idle wait',
'STREAMS apply slave waiting for coord message',
'STREAMS capture process filter callback wait for ruleset',
'STREAMS fetch slave waiting for txns',
'STREAMS waiting for subscribers to catch up',
'Streams AQ: RAC qmn coordinator idle wait',
'Streams AQ: deallocate messages from Streams Pool',
'Streams AQ: delete acknowledged messages',
'Streams AQ: qmn coordinator idle wait',
'Streams AQ: qmn slave idle wait',
'Streams AQ: waiting for messages in the queue',
'Streams AQ: waiting for time management or cleanup tasks',
'Streams fetch slave: waiting for txns',
'class slave wait',
'client message',
'dispatcher timer',
'gcs for action',
'gcs remote message',
'ges remote message',
'i/o slave wait',
'jobq slave wait',
'knlqdeq',
'lock manager wait for remote message',
'master wait',
'null event',
'parallel query dequeue',
'pipe get',
'pmon timer',
'queue messages',
'rdbms ipc message',
'slave wait',
'smon timer',
'virtual circuit status',
'wait for activate message',
'wait for unread message on broadcast channel',
'wakeup event for builder',
'wakeup event for preparer',
'wakeup event for reader',
'wakeup time manager')
/
-- The End --