等待事件

等待事件概览
    * v$event_name:这个视图记录着当前数据库支持的等待事件及其基本信息
    * Oracle 的等待事件主要可以分为两类,即空闲(idle)等待事件和非空闲(non-idle)等待事件。
      空闲事件指 Oracle 正等待某种工作,在诊断和优化数据库的时候,我们不用过多注意这部分事件。
      非空闲等待事件专门针对 Oracle 的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是我们在调整数据库的时候应该关注与研究的。    
    
等待事件分类
    * Oracle 11g R2中主要分类及各类等待事件的个数    
    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                                   958
          1    4217450380 Application                                   17
          2    3290255840 Configuration                                24
          3    4166625743 Administrative                               55
          4    3875070507 Concurrency                                   33
          5    3386400367 Commit                                    2
          6    2723168908 Idle                                       96
          7    2000153315 Network                                   35
          8    1740759767 User I/O                                   48
          9    4108307767 System I/O                                   32
         10    2396326234 Scheduler                                    8
         11    3871361733 Cluster                                   50
         12        644977587 Queueing                                    9

    13 rows selected.
    SQL>     

    
从等待发现历史瓶颈    
    * 通过查询 V$SYSTEM_WAIT_CLASS 视图获得各类主要等待事件的等待时间和等待次数等信息,通过分类以及统计信息,可以很直观地快速获得数据库的整体印象。
    SQL>  set  numwidth 30
    SQL>  select * from v$system_wait_class order by time_waited;
    WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS                                                       TOTAL_WAITS TIME_WAITED TOTAL_WAITS_FG TIME_WAITED_FG
    ------------- ----------- ---------------------------------------------------------------- ----------- ----------- -------------- --------------
       2396326234          10 Scheduler                                                               4882        3504           4654           3246
       3386400367           5 Commit                                                               5175978      573796        5165499         572165
       2000153315           7 Network                                                            777336459      749926      769131912         748125
       4217450380           1 Application                                                          4434302     7381881        4397678        7364695
       1893977003           0 Other                                                              100729436    17616970        8174372       16305755
       1740759767           8 User I/O                                                          6181252645    25640434     6153846672       24928475
       3875070507           4 Concurrency                                                         31874404    27587290       31626616       22056683
       4166625743           3 Administrative                                                      93480936    55969848           4832         184803
       4108307767           9 System I/O                                                         557921472    74836663       77811450         339619
       3290255840           2 Configuration                                                        2617482   105558521        2595392       99440746
       2723168908           6 Idle                                                              1034274573  1.1087E+11      746393167     3.2167E+10
       

    * 相关视图:
      V$SESSION(V$SESSION_WAIT):会话当前正在发生的事件
      V$SESSION_EVENT :活动会话在其生命周期经历的事件(对V$SESSION的累积)
      V$SYSTEM_EVENT :作为数据库整体等待事件保存(对V$SESSION_EVENT的累积)
      注意,V$SESSION_EVENT 或者 V$SYSTEM_EVENT 视图的累积信息以及关于等待的平均计算,使我们无法得知个别等待消耗的时间长短。为了解决这一问题,Oracle 10g 引入了一个新的视图 v$event_histogram,通过这个视图可
以看到等待事件的柱状图分布,从而可以对一个等待事件的具体分布有进一步的了解。在以下查询输出中可以看到,cursor: pin S wait on X 的竞争主要是 16至512 毫秒的竞争。但是注意等
待时间在 4096 毫秒左右的等待也有 2 次。

    SQL> set  numwidth 30
    SQL> SELECT event, wait_time_milli, wait_count
      2  FROM v$event_histogram WHERE event = 'cursor: pin S wait on X';    
    EVENT                                                                           WAIT_TIME_MILLI                     WAIT_COUNT
    ---------------------------------------------------------------- ------------------------------ ------------------------------
    cursor: pin S wait on X                                                                       1                          23116
    cursor: pin S wait on X                                                                       2                          14786
    cursor: pin S wait on X                                                                       4                          28929
    cursor: pin S wait on X                                                                       8                          55937
    cursor: pin S wait on X                                                                      16                    59049323576
    cursor: pin S wait on X                                                                      32                      440755320
    cursor: pin S wait on X                                                                      64                        8417963
    cursor: pin S wait on X                                                                     128                        4674251
    cursor: pin S wait on X                                                                     256                          13744
    cursor: pin S wait on X                                                                     512                            379
    cursor: pin S wait on X                                                                    1024                             27
    cursor: pin S wait on X                                                                    2048                              0
    cursor: pin S wait on X                                                                    4096                              2

    13 rows selected.

    SQL>        

从等待确定当前瓶颈
    * ASH
    * 确定当前主要影响性能的等待事件
    col event format a30
    col p1text format a20
    select sid,event,p1,p1text from v$session where event not like '%client%';
    
    * 捕获相关sql
    spool /home/oracle/sqltext.txt
    select sql_text from v$sqltext a
    where a.hash_value = (select sql_hash_value from v$session b where b.event = '通过上条SQL获取等待事件')
    order by piece asc;
    spool off
    
    
    

 

posted @ 2018-10-17 11:00  PoleStar  阅读(276)  评论(0编辑  收藏  举报