当前位置:数据库 > Oracle >>

Oracle OWI等待事件视图(v$session_wait/v$session_event/v$system_event)

Oracle OWI等待事件视图(v$session_wait/v$session_event/v$system_event)
 
   通常情况下,用户提交一条SQL语句,总会存在这样或那样的等待事件。也就是说由于所需资源被占用导致进程不得不处于等待状态。Oracle为我们提供了获取这些等待事件的可用视图。根据这些视图可以得知哪些事件导致该SQL语句效率低下而采取相应的修改或调整。本文基于Oracle 10g描述了如何通过视图v$session_wait,v$session_event,以及v$system_event去获取等待事件的相关信息。
 
1、等待事件相关参数
  timed_statistics
      指定了在搜集数据库统计信息时,与时间相关的统计信息是否会被收集。该参数影响等待事件中时间相关的值,且受制于statistics_level。
  statistics_level
      指定了收集数据库以及操作系统统计信息的级别。
      该参数值的范围STATISTICS_LEVEL = { ALL | TYPICAL | BASIC },可修改级别ALTER SESSION, ALTER SYSTEM
      缺省情况下为TYPICAL 
 
2、等待事件的相关视图
  可以从dict数据库字典中获得当前数据库的与等待事件相关的视图,如使用如下SQL来获得: 
      SELECT *
        FROM dict
       WHERE table_name LIKE '%V$EVENT%' OR table_name LIKE '%V$%WAIT%';
   
  几个重要的等待事件视图
      下面这三个视图提供了不同粒度级的等待事件统计和计时信息。
      v$SESSION_WAIT(最低粒度的等待事件)
      v$SESSION_EVENT(该视图提供上一视图等待事件的汇总)
      v$SYSTEM_EVENT(该视图提供自实例启动以来所有等待事件的汇总)
    
  几个视图的粒度关系
      V$SESSION_WAIT ⊂ v$SESSION_EVENT ⊂ v$SYSTEM_EVENT
      下面将逐一描述这些视图
 
3、视图v$event_name
  该视图列出了当前Oracle版本中所有等待事件的描述信息。如等待事件的ID,名字,参数,类别等等
      SELECT COUNT (*) FROM v$event_name;
    
      SELECT wait_class, COUNT (*)
      FROM v$event_name
      GROUP BY wait_class
      ORDER BY 2;
 
4、视图v$session_wait
    该视图显示的基于会话级的等待信息,为每个会话当前正在等待的事件或资源提供详细信息。
    也就是说在视图v$session_wait中,每一个连接到的实例的session都对应一行活动的或不活动的信息。
    视图的p1,p2,p3标识了对应的session正在等待的具体资源,p1text,p2text,p3text则是对p1,p2,p3的文字描述。
    从Oracle 10g R1启,该视图的所有信息可以直接从v$session获得。
          
  1)、state字段有四种含义﹕
    a、Waiting:当前SESSION正等待这个事件。SECONDS_IN_WAIT表示已经等待的时间。
    b、Waited unknown time:参数timed_statistics值为false时,无法确定等待时间。
    c、Wait short time:表示发生了等待,且低于1厘秒,此情形下wait_time列显示为-1。
    d、Waited known time:如果session等待然后得到了所需资源,那么将从waiting进入本状态,并且时间发送给wait_time列
  
  2)、wait_time值也有四种含义:
    a、值>0:最后一次等待时间(单位:厘秒),当前未在等待状态。
    b、值=0:session正在等待当前的事件。
    c、值=-1:最后一次等待时间小于1个统计单位,当前未在等待状态。
    d、值=-2:时间统计状态未置为可用,当前未在等待状态。
  
  3)、wait_time和seconds_in_wait字段值与state相关:
    a、如果state值为Waiting,则wait_time值无效。seconds_in_wait值为实际的等待时间(单位:秒)。
    b、如果state值为Wait unknow time或者Wait short time,那么wait_time值和Seconds_in_wait值都无效。
    c、如果state值为Waiting known time,则wait_time值就是实际等待时间(单位:秒),seconds_in_wait值无效。
  
  4)、指定session当前的等待事件
      SELECT *
        FROM v$session_wait
       WHERE sid = &input_sid;
 
5、视图v$session_event
    该视图记录了每个session的每一个等待事件的总等待时间,已等待时间以及最大等待时间。
    也就是说该视图是对每个session自启动以来所经历的所有等待的汇总。
    v$session_event视图的SID列提供了基于sid来获得等待事件信息。
  
    该视图相当于v$system_event的一个子集,两者都提供基于等待时间的统计信息
    其差异是v$session_event提供的是会话级的统计信息,v$system_event提供的是实例级别统计信息
    SQL> desc v$session_event;
    Name              Type         Nullable Default Comments 
    ----------------- ------------ -------- ------- -------- 
    SID               NUMBER       Y                         
    EVENT             VARCHAR2(64) Y        事件名称                      
    TOTAL_WAITS       NUMBER       Y        当前事件总等待次数                 
    TOTAL_TIMEOUTS    NUMBER       Y        自会话初次等待之后未能成功获得所请求资源的次数                 
    TIME_WAITED       NUMBER       Y        等待该事件所耗用的总时间(百分之一秒)                
    AVERAGE_WAIT      NUMBER       Y        平均等待时间(重要参考列,百分之一秒)                
    MAX_WAIT          NUMBER       Y        最大等待时间(百分之一秒)                
    TIME_WAITED_MICRO NUMBER       Y                         
    EVENT_ID          NUMBER       Y                         
    WAIT_CLASS_ID     NUMBER       Y                         
    WAIT_CLASS#       NUMBER       Y                         
    WAIT_CLASS        VARCHAR2(64) Y 
 
6、视图v$system_event
    显示自实例启动后所有Oracle会话遇到的所有等待时间的总和,包括等待的总次数,总超时,是所有会话的在所有等待事件上的汇总。
    SQL> desc v$system_event;
    Name              Type         Nullable Default Comm
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,