select t2.event,

       round(100 * t2.time_waited / (t1.w1 + t3.cpu), 2) event_wait_percent

  from (SELECT SUM(time_waited) w1

          FROM v$system_event

         WHERE event NOT IN

               ('smon timer',

                'pmon timer',

                'rdbms ipc message',

                'Null event',

                'parallel query dequeue',

                'pipe get',

                'client message',

                'SQL*Net message to client',

                'SQL*Net message from client',

                'SQL*Net more data from client',

                'dispatcher timer',

                'virtual circuit status',

                'lock manager wait for remote message',

                'PX Idle Wait',

                'PX Deq: Execution Msg',

                'PX Deq: Table Q Normal',

                'wakeup time manager',

                'slave wait',

                'i/o slave wait',

                'jobq slave wait',

                'null event',

                'gcs remote message',

                'gcs for action',

                'ges remote message',

                'queue messages',

                'wait for unread message on broadcast channel',

                'PX Deq Credit: send blkd',

                'PX Deq: Execute Reply',

                'PX Deq: Signal ACK',

                'PX Deque wait',

                'PX Deq Credit: need buffer',

                'STREAMS apply coord waiting for slave message',

                'STREAMS apply slave waiting for coord message',

                'Queue Monitor Wait',

                'Queue Monitor Slave Wait',

                'wakeup event for builder',

                'wakeup event for preparer',

                'wakeup event for reader',

                'wait for activate message',

                'PX Deq: Par Recov Execute',

                'PX Deq: Table Q Sample',

                'STREAMS apply slave idle wait',

                'STREAcapture process filter callback wait for ruleset',

                'STREAMS fetch slave waiting for txns',

                'STREAMS waiting for subscribers to catch up',

                'Queue Monitor Shutdown Wait',

                'AQ Proxy Cleanup Wait',

                'knlqdeq',

                'class slave wait',

                'master wait',

                'DIAG idle wait',

                'ASM background timer',

                'KSV master wait',

                'EMON idle wait',

                'Streams AQ:RACqmn coordinator idle wait',

                'Streams AQ: qmn coordinator idle wait',

                'Streams AQ: qmn slave idle wait',

                'Streams AQ: waiting for time management or cleanup tasks',

                'Streams AQ: waiting for messages in the queue',

                'Streams fetch slave: waiting for txns',

                'Streams AQ:deallocate messages from Streams Pool',

                'Streams AQ: delete acknowledged messages',

                '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')) t1,

       (select *

          from (select t.event,

                       t.total_waits,

                       t.total_timeouts,

                       t.time_waited,

                       t.average_wait,

                       rownum num

                  from (select event,

                               total_waits,

                               total_timeouts,

                               time_waited,

                               average_wait

                          from v$system_event

                         where event not in

                               ('smon timer',

                                'pmon timer',

                                'rdbms ipc message',

                                'Null event',

                                'parallel query dequeue',

                                'pipe get',

                                'client message',

                                'SQL*Net message to client',

                                'SQL*Net message from client',

                                'SQL*Net more data from client',

                                'dispatcher timer',

                                'virtual circuit status',

                                'lock manager wait for remote message',

                                'PX Idle Wait',

                                'PX Deq: Execution Msg',

                                'PX Deq: Table Q Normal',

                                'wakeup time manager',

                                'slave wait',

                                'i/o slave wait',

                                'jobq slave wait',

                                'null event',

                                'gcs remote message',

                                'gcs for action',

                                'ges remote message',

                                'queue messages',

                                'wait for unread message on broadcast channel',

                                'PX Deq Credit: send blkd',

                                'PX Deq: Execute Reply',

                                'PX Deq: Signal ACK',

                                'PX Deque wait',

                                'PX Deq Credit: need buffer',

                                'STREAMS apply coord waiting for slave message',

                                'STREAMS apply slave waiting for coord message',

                                'Queue Monitor Wait',

                                'Queue Monitor Slave Wait',

                                'wakeup event for builder',

                                'wakeup event for preparer',

                                'wakeup event for reader',

                                'wait for activate message',

                                'PX Deq: Par Recov Execute',

                                'PX Deq: Table Q Sample',

                                'STREAMS apply slave idle wait',

                                'STREAcapture process filter callback wait for ruleset',

                                'STREAMS fetch slave waiting for txns',

                                'STREAMS waiting for subscribers to catch up',

                                'Queue Monitor Shutdown Wait',

                                'AQ Proxy Cleanup Wait',

                                'knlqdeq',

                                'class slave wait',

                                'master wait',

                                'DIAG idle wait',

                                'ASM background timer',

                                'KSV master wait',

                                'EMON idle wait',

                                'Streams AQ: RAC qmn coordinator idle wait',

                                'Streams AQ: qmn coordinator idle wait',

                                'Streams AQ: qmn slave idle wait',

                                'Streams AQ: waiting for time management or cleanup tasks',

                                'Streams AQ: waiting for messages in the queue',

                                'Streams fetch slave: waiting for txns',

                                'Streams AQ:deallocate messages from Streams Pool',

                                'Streams AQ: delete acknowledged messages',

                                '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')

                         order by time_waited desc) t)

         where num < 11) t2,

       (SELECT VALUE CPU

          FROM v$sysstat

         WHERE NAME LIKE 'CPU used by this session') t3;

当存在latch event的时候,很容易的通过v$session_wait视图查到是哪些会话产生的:

select sid,seq#,event from v$session_wait

如果需要具体确定热点对象,可以通过v$latch_children中查询具体的子latch信息

SELECT *
  FROM (SELECT addr,


               child#,


               gets,


               misses,


               sleeps,


               immediate_gets   igets,


               immediate_misses imiss,


               spin_gets        sgets


          FROM v$latch_children


         WHERE NAME = 'cache buffers chains'


         ORDER BY sleeps DESC)


 WHERE ROWNUM < 11;

亦可以通过以下语句获取最热数据库的latch和buffer信息

SELECT b.addr,

       a.ts#,

       a.dbarfil,

       a.dbablk,

       a.tch,

       b.gets,

       b.misses,

       b.sleeps

  FROM (SELECT *

          FROM (SELECT addr, ts#, file#, dbarfil, dbablk, tch, hladdr

                  FROM x$bh

                 ORDER BY tch DESC)

         WHERE ROWNUM < 11) a,

       (SELECT addr, gets, misses, sleeps

          FROM v$latch_children

         WHERE NAME = 'cache buffers chains') b

 WHERE a.hladdr = b.addr

可以找到这些热点buffer的对象信息:

SELECT distinct e.owner, e.segment_name, e.segment_type

  FROM dba_extents e,

       (SELECT *

          FROM (SELECT addr, ts#, file#, dbarfil, dbablk, tch

                  FROM x$bh

                 ORDER BY tch DESC)

         WHERE ROWNUM < 11) b

 WHERE e.relative_fno = b.dbarfil

   AND e.block_id <= b.dbablk

   AND e.block_id + e.blocks > b.dbablk;

结合v$sqltext或v$sqlarea可以找到对象的相关SQL:

break on hash_value skip 1

SELECT /*+ rule */

 hash_value, sql_text

  FROM v$sqltext

 WHERE (hash_value, address) IN

       (SELECT a.hash_value, a.address

          FROM v$sqltext a,

               (SELECT DISTINCT a.owner, a.segment_name, a.segment_type

                  FROM dba_extents a,

                       (SELECT dbarfil, dbablk

                          FROM (SELECT dbarfil, dbablk

                                  FROM x$bh

                                 ORDER BY tch DESC)

                         WHERE ROWNUM < 11) b

                 WHERE a.relative_fno = b.dbarfil

                   AND a.block_id <= b.dbablk

                   AND a.block_id + a.blocks > b.dbablk) b

         WHERE a.sql_text LIKE '%' || b.segment_name || '%'

           AND b.segment_type = 'TABLE')

 ORDER BY hash_value, address, piece