V$SESSION_WAIT 墨蓝 2022-08-10 15:48 28阅读 0赞 **(1)-V$SESSION\_WAIT ** 这是一个寻找性能瓶颈的关键视图。它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件)。当系统存在性能问题时,本视图可以做为一个起点指明探寻问题的方向。 V$SESSION\_WAIT中,每一个连接到实例的session都对应一条记录。 **V$SESSION\_WAIT中的常用列** ** ** l SID: session标识 l EVENT: session当前等待的事件,或者最后一次等待事件。 l WAIT\_TIME: session等待事件的时间(单位,百分之一秒)如果本列为0,说明session当前session还未有任何等待。 l SEQ\#: session等待事件将触发其值自增长 l P1, P2, P3: 等待事件中等待的详细资料 l P1TEXT, P2TEXT, P3TEXT: 解释说明p1,p2,p3事件 **附注:** 1.State字段有四种含义﹕ (1)Waiting:SESSION正等待这个事件。 (2)Waited unknown time:由于设置了timed\_statistics值为false,导致不能得到时间信息。表示发生了等待,但时间很短。 (3)Wait short time:表示发生了等待,但由于时间非常短不超过一个时间单位,所以没有记录。 (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 GROUPBY event ORDERBYcount(\*); 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的分组查询列出下列的信息: l 多数的session都是空闲事件如:SQL\*Net message from client, pipe get, PMON timer等。 l 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** 本视图记录了每个session的每一项等待事件。由上文所知V$SESSION\_WAIT显示了session的当前等待事件,而V$SESSION\_EVENT则记录了session自启动起所有的事件。 **V$SESSION\_EVENT中的常用列** l SID:session标识 l EVENT:session等待的事件 l TOTAL\_WAITS:此session当前事件的总等待数 l TIME\_WAITED:此session总等待时间(单位,百分之一秒) l AVERAGE\_WAIT:此session当前事件平均等待时间(单位,百分之一秒) l TOTAL\_TIMEOUTS:等待超时次数 其它用法与V$SESSION\_WAIT相似,不详述了 **附注:** Oracle的等待事件是衡量Oracle运行状况的重要依据及指标。等待事件的概念是在Oracle7.0.1.2中引入的,大致有100个等待事件。在Oracle 8.0中这个数目增加到了大约150个,在Oracle8i中大约有200个事件,在Oracle9i中大约有360个等待事件。主要有两种类别的等待事件,即空闲(idle)等待事件和非空闲(non-idle)等待事件。 [v$active\_session\_history的wait\_time和time\_waited 列][v_active_session_history_wait_time_time_waited] *2009-08-24 19:41:17* 分类: Linux 最近在弄informix,oracle调优也好久没碰了,今天朋友问我v$active\_session\_history的wait\_time和time\_waited 怎么看,只记得用过,一下也没想起。连忙验证了下 wait\_time 这列,对于在采样时,正在等待的事件,该列为0。对应session\_state列。不为0的行是在进行CPU time\_waited这列,是这次等待的等待时间,如果该种类的等待的时间的超时时间大于1秒,那么如果等待了超过了1秒,本次采样的time\_waited为0,在最后一次采样到该等待时,置上等待时间。单位百万分之一秒。也就是说,time\_waited为0的行也不用看,因为等待时候在后面会体现,其和最后的行是同一次等待。 下面是以前用过的一个SQL SELECT EVENT, COUNT(\*) TOTAL\_WAITS, TRUNC(SUM(TIME\_WAITED) / 1000000) SECONDS\_IN\_WAIT FROM V$ACTIVE\_SESSION\_HISTORY WHERE SESSION\_STATE = 'WAITING' AND TIME\_WAITED > 0 AND SAMPLE\_ID BETWEEN 1800000 AND 2000000 AND SESSION\_ID = 144 AND SQL\_ID = 'cgb71p2hy4zfj' GROUP BY EVENT 其实v$active\_session\_history就是一个语句在运行中遇到的所有等待的统计,可以一定程度上代替10046来查看SQL遭遇的等待 [v_active_session_history_wait_time_time_waited]: http://blog.itpub.net/8242091/viewspace-613107/
还没有评论,来说两句吧...