天天看点

oracle等待事件13——小结

在oracle的性能调优中常见的三个视图是必须要熟悉的:v$system_event ,  v$session_event  ,  v$session_wait 。

1、v$system_event:

本视图概括了实例各项事件的等待信息。v$session_wait显示了系统的当前等待项,v$system_event则提供了自实例启动后各个等待事件的概括。常用于获取系统等待信息的历史影象。而通过两个snapshot获取等待项增量,则可以确定这段时间内系统的等待项。

V$SYSTEM_EVENT中的常用列:

EVENT:    等待事件名称

TOTAL_WAITS:   此项事件总等待次数

TIME_WAITED:  此项事件的总等待时间(单位:百分之一秒)

AVERAGE_WAIT:  此项事件的平均等待用时(单位:百分之一秒)(time_waited/total_waits)

TOTAL_TIMEOUTS:此项事情总等待超时次数

示例:

1.查看系统的各项等待,按总耗时排序 :

SQL> SELECT event,total_waits waits,total_timeouts timeouts, time_waited total_time,average_wait avg FROM V$SYSTEM_EVENT ORDER BY 4 DESC;

EVENT                                                  WAITS   TIMEOUTS TOTAL_TIME        AVG

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

rdbms ipc message                      230184     201139   56165487        244

SQL*Net message from client     186814          0   35007514        187

jobq slave wait                               33646      32453   10392022        309

pmon timer                                    24483      24481    7233256        295

virtual circuit status                     2398       2397    7211623       3007

dispatcher timer                         1199       1199    7187756       5995

Queue Monitor Wait                   2335       2296    7068245       3027

smon timer                                  292        228    7017478      24032

wakeup time manager                876        424    6442029       7354

wait for unread message on       51817      51409    5326344        103

broadcast channel

EVENT                                            WAITS   TIMEOUTS TOTAL_TIME        AVG

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

queue messages                         10567      10290    5317995        503

Queue Monitor Slave Wait            74         74     430501       5818

class slave wait                            293        293     331264       1131

Queue Monitor Task Wait            282        211     136186        483

db file sequential read               87363          0      93439          1

PX Idle Wait                                  305        302      61502        202

db file scattered read               11739          0       8187          1

control file sequential read        6785          0       7373          1

EVENT                                        WAITS   TIMEOUTS TOTAL_TIME        AVG

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

control file parallel write            23750          0       4583          0

log file parallel write                   26899          0       3847          0

log file sync                               7558          8       2825          0

db file parallel write                 30893          0       2123          0

library cache load lock             206          0       1521          7

process startup                         343          0        467          1

log file switch completion         58          0        443          8

比如,通过checkpoint completed、log file switch(checkpoint incomplete)可以查看检查点进程的性能。通过log file parallel write、log file switch completed可以查看联机重做日志文件的性能。通过log file switch(archiving needed)事件可以检查归档进程的性能。

找出瓶颈:

1。通过Statspack列出空闲事件。

2。检查不同事件的等待时间开销。

3。检查每条等待记录的平均用时,因为某些等待事件(比较log file switch completion)可能周

期性地发生,但发生时却造成了严重的性能损耗。

2、v$session_wait:

这是一个寻找性能瓶颈的关键视图。它提供了任何情况下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字段有四种含义﹕

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

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

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

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

 Wait_time值也有四种含义:

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

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

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

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

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.列出当前系统的等待事件 :

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。

 列出指定ID的等待事件 

select * from v$session_wait where sid=100;

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

3、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论坛看到有热心人整理的chm格式非空闲事件说明,有兴趣的朋友可以下载,链接如下:

4、主要等待事件:

这个在前12篇文章中,我们基本上详细了解了各种重要的非空闲等待事件,下面我主要列举一下空闲等待事件,以供各位童鞋了解这些等待事件的意思。

空闲等待意味着oracle正在等待某种动作发生。有时,oracle进程在等待,实际上并不是因为忙而等待,而是因为没有事情所以在等待。如:smon timer等待事件,smon进程的一些操作是每个一段时间轮询执行的,在系统不忙的时候,这种操作也不会立即发生,而是等待计时器达到一个定时刻再来执行,这时候就会产生smon timer 等待事件。

我们要明白的是,只有很少的空闲等待时间与性能有关,大多数的空闲等待事件对性能没有影响。

典型的空闲等待事件:

client message : 客户机消息

null event : null事件

pipe get : 管道取操作

SQL* NET message from  client : 来自客户端的消息

SQL*NET message to client : 发送至客户端的消息

rdbms ipc message : 数据库的ipc消息

virrual circuit status : 虚拟环路状态信息

smon timer : smon 计时器

pmon timer : pmon计时器

dispacher timer :调度器计时器。