oracle session_wait,Oracle等待视图v$session_wait

Oracle动态性能视图v$session_wait & v$session

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

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

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字段有四种含义﹕

Waiting:SESSION正等待这个事件。

Waited unknown time:由于设置了timed_statistics值为false,导致不能得到时间信息。表示发生了等待,但时间很短。

Wait short time:表示发生了等待,但由于时间非常短不超过一个时间单位,所以没有记录。

Waited knnow time:如果session等待然后得到了所需资源,那么将从waiting进入本状态。

2.Wait_time值也有四种含义:

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

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

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

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

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

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

如果state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。

如果state值为Wait short time,那么wait_time值和Second_in_wait值都无用。

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

V$SESSION_WAIT中的连接列

Column        View        Joined Column(s)

SID        V$SESSION        SID

示例

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

SQL> 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的等待事件

SQL> select * from v$session_wait where sid=100;

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

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

P1—与等待相关的数据文件的全部文件数量。

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

P3—描述等待产生原因的代码。

例:

SQL> select p1 "File #", p2 "Block #", p3 "Reason Code"

from v$session_wait

where event = 'buffer busy waits';

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

SQL> 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扫描找到当前块,但块中的更改开始并且没有结束。

V$SESSION_EVENT

本视图记录了每个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博客 ” ,链接:http://blog.itpub.net/16978544/viewspace-701658/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值