学习动态性能表(6)--v$session_wait&v$session_event

学习动态性能表html

第六篇-(1)-V$SESSION_WAIT  2007.5.30数据库

  这是一个寻找性能瓶颈的关键视图。它提供了任何状况下session在数据库中当前正在等待什么(若是session当前什么也没在作,则显示它最后的等待事件)。当系统存在性能问题时,本视图能够作为一个起点指明探寻问题的方向。session

 

  V$SESSION_WAIT中,每个链接到实例的session都对应一条记录。ide

 

V$SESSION_WAIT中的经常使用列性能

 

  • SID: session标识
  • EVENT: session当前等待的事件,或者最后一次等待事件。
  • WAIT_TIME: session等待事件的时间(单位,百分之一秒)若是本列为0,说明session当前session还未有任何等待。
  • SEQ#: session等待事件将触发其值自增加
  • P1, P2, P3: 等待事件中等待的详细资料
  • P1TEXT, P2TEXT, P3TEXT: 解释说明p1,p2,p3事件

 

附注:学习

1.State字段有四种含义﹕ui

(1)Waiting:SESSION正等待这个事件。google

(2)Waited unknown time:因为设置了timed_statistics值为false,致使不能获得时间信息。表示发生了等待,但时间很短。编码

(3)Wait short time:表示发生了等待,但因为时间很是短不超过一个时间单位,因此没有记录。.net

(4)Waited knnow time:若是session等待而后获得了所需资源,那么将从waiting进入本状态。

 

2.Wait_time值也有四种含义:

(1)值>0:最后一次等待时间(单位:10ms),当前未在等待状态。

(2)值=0:session正在等待当前的事件。

(3)值=-1:最后一次等待时间小于1个统计单位,当前未在等待状态。

(4)值=-2:时间统计状态未置为可用,当前未在等待状态。

 

3.Wait_time和Second_in_wait字段值与state相关:

(1)若是state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的等待时间(单位:秒)。

(2)若是state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。

(3)若是state值为Wait short time,那么wait_time值和Second_in_wait值都无用。

(4)若是state值为Waiting known time,那么wait_time值就是实际等待时间(单位:秒),Second_in_wait值无用。

 

V$SESSION_WAIT中的链接列

 

Column         View                     Joined Column(s)

SID               V$SESSION         SID

 

示例:

1.列出当前系统的等待事件

SELECT event,

       sum(decode(wait_time,0,1,0)) "Curr",

       sum(decode(wait_time,0,0,1)) "Prev",

       count(*)"Total"

  FROM v$session_wait GROUP BY event ORDER BY count(*);

EVENT                                             Prev        Curr        Tot

---------------------------------------------       ----         -----        -----

PL/SQL lock timer                             0            1            1

SQL*Net more data from client           0            1            1

smon timer                                        0            1            1

pmon timer                                        0            1            1

SQL*Net message to client                  2            0            2

db file scattered read                           2            0            2

rdbms ipc message                              0            7            7

Enqueue                                            0            12           12

pipe get                                             0            12           12

db file sequential read                         3            10           13

latch free                                           9            6            15

SQL*Net message from client              835         1380       2215

 

这个按事件和wait_time的分组查询列出下列的信息:

  • 多数的session都是空闲事件如:SQL*Net message from client, pipe get, PMON timer等。
  • session的cpu占用能够经过上次session的非等待事件大体算出,除此问题外:看起来多数session没有在等待什么事情(难道他们都在干活?)但其最后等待事件都是SQL*Net message from client。

 

2.列出指定ID的等待事件

select * from v$session_wait where sid=100;

 

3.应用p1,p2,p3进行等待事件的分析

v$session_wait视图的列表明的缓冲区忙等待事件以下:

P1—与等待相关的数据文件的所有文件数量。

P2—P1中的数据文件的块数量。

P3—描述等待产生缘由的代码。

例:select p1 "File #", p2 "Block #", p3 "Reason Code"

  from v$session_wait

  where event = 'buffer busy waits';

若是以上查询的结果显示一个块在忙等待,如下的查询将显示这一块的名称和类型:

select owner, segment_name, segment_type

 from dba_extents

 where file_id = &P1 and &P2 between block_id and block_id + blocks -1;

 

  咱们也能够查询dba_data_files以肯定等待的文件的file_name,方法是使用v$session_wait中的P1。

  从v$session_wait中查询P3(缘由编码)的值能够知道session等待的缘由。缘由编码的范围从0到300,下列为部分编码所表明的事项:

0 块被读入缓冲区。

100 咱们想要NEW(建立)一个块,但这一块当前被另外一session读入。

110 咱们想将当前块设为共享,但这一块被另外一session读入,因此咱们必须等待read()结束。

120 咱们想得到当前的块,但其余人已经将这一块读入缓冲区,因此咱们只能等待他人的读入结束。

130 块被另外一session读入,并且没有找到其它协调的块,因此咱们必须等待读的结束。缓冲区死锁后这种状况也有可能产生。因此必须读入块的CR。

200 咱们想新建立一个block,但其余人在使用,因此咱们只好等待他人使用结束。

210 Session想读入SCUR或XCUR中的块,若是块交换或者session处于非连续的TX模式,因此等待可能须要很长的时间。

220 在缓冲区查询一个块的当前版本,但有人以不合法的模式使用这一块,因此咱们只能等待。

230 以CR/CRX方式得到一个块,但块中的更改开始而且没有结束。

231 CR/CRX扫描找到当前块,但块中的更改开始而且没有结束。

 

第六篇-(2)-V$SESSION_EVENT  2007.5.30

 

  本视图记录了每一个session的每一项等待事件。由上文所知V$SESSION_WAIT显示了session的当前等待事件,而V$SESSION_EVENT则记录了session自启动起全部的事件。

 

 

V$SESSION_EVENT中的经常使用列

  • SID:session标识
  • EVENT:session等待的事件
  • TOTAL_WAITS:此session当前事件的总等待数
  • TIME_WAITED:此session总等待时间(单位,百分之一秒)
  • AVERAGE_WAIT:此session当前事件平均等待时间(单位,百分之一秒)
  • TOTAL_TIMEOUTS:等待超时次数

 

其它用法与V$SESSION_WAIT类似,不详述了

 

 

附注:

 

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

关于空闲事件和非空闲事件目前经过google能够搜索到很是多详尽的相关信息,同时

Oracle Database Performance Tuning Guide and Reference中关于Wait Events也有很是详尽的描述,在此就很少费口舌了。不过我在itpub论坛看到有热心人整理的chm格式非空闲事件说明,有兴趣的朋友能够下载,连接以下:

非空闲事件说明

详见:http://www.itpub.net/728733.html

相关文章
相关标签/搜索