等待事件

等待事件:

很长时间以来,通过什么样的手段来衡量数据库的状况,发现数据库的问题,优化数据库的性能一直是人们广为争论的话题。从Oracle 7.0.12开始,Oracle引入了等待事件,随即等待事件成为了数据库性能优化的一个重要指导。

当一个进程连接到数据库之后,进程所经历的种种等待就开始被记录,并且通过一系列的动态性能视图进行展现。通过等待事件用户可以很快地发现数据库的性能瓶颈,从而进行针对性优化和分析。下面将着重介绍等待事件在Oracle研究及优化过程中的作用。

等待事件的起源:

等待事件的概念是在Oracle 7.0.12中引入的,大致有100个等待事件。在Oracle 9.0中这个数目增加到了大约150个,在Oracle 8i中大约有220个事件,在Oracle 9iR2中大约有400个等待事件,在Oracle 10gR2中大约有874个等待事件,而在最近的Oracle 11gR1中,等待事件的数目已经接近1000个了。

虽然不同的版本和组件安装可能会有不同数目的等待事件,但是这些等待事件都可以通过查询V$EVENT_NAME视图获得:

sys@TQGZS11G> select * from v$version where rownum <2;
BANNER
---------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
sys@TQGZS11G> select count(*) from v$event_name;
  COUNT(*)
----------
       997

研究Oracle的等待事件,v$event_name视图是一个很好的开始,这个视图记录着当前数据库支持的等待事件及其基本信息。

Oracle的等待事件,主要可以分为两类,即空闲(idle)等待事件和非空闲(non-idle)等待事件。空闲事件指Oracle正等待某种工作,在诊断和优化数据库的时候,我们不用过多注意这部分事件。非空闲等待事件专门针对Oracle的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是我们在调整数据库的时候应该关注与研究的。

在Oracle 10g之中,Oracle的Statspack会创建一个视图stats$idle_event记录空闲等待事件:

sys@TQGZS> select * from stats$idle_event;
EVENT
----------------------------------------------------------------
AQ Proxy Cleanup Wait
ASM background timer
DIAG idle wait
EMON idle wait
KSV master wait
LNS ASYNC archive log
LNS ASYNC dest activation
... ...
rdbms ipc message
slave wait
smon timer
virtual circuit status
wait for activate message
wait for unread message on broadcast channel
wakeup event for builder
wakeup event for preparer
wakeup event for reader
wakeup time manager
70 rows selected.

从Oracle 10g开始,Oracle对等待事件进行了更为详细的分类,v$event_name视图也增加了相关分类的字段:

sys@TQGZS> desc v$event_name
Name              Null?    Type
----------------- -------- ------------------
EVENT#                     NUMBER
EVENT_ID                   NUMBER
NAME                       VARCHAR2(64)
PARAMETER1                 VARCHAR2(64)
PARAMETER2                 VARCHAR2(64)
PARAMETER3                 VARCHAR2(64)
WAIT_CLASS_ID              NUMBER
WAIT_CLASS#                NUMBER
WAIT_CLASS                 VARCHAR2(64)

v$event_name视图中的PARAMETER1、PARAMETER2、PARAMETER3非常重要,对于不同的等待事件参数其意义各不相同:

sys@TQGZS> select name,PARAMETER1,PARAMETER2,PARAMETER3 from v$event_name
  2  where name = 'db file scattered read';
NAME                      PARAMETER1 PARAMETER2 PARAMETER3
------------------------- ---------- ---------- ----------
db file scattered read    file#      block#     blocks

看一下Oracle 11gR1中主要分类及各类等待事件的个数:

sys@CCDB> select wait_class#,wait_class_id,wait_class,count(*) as "count"
  2  from v$event_name                           
  3  group by wait_class#,wait_class_id,wait_class
  4  order by wait_class#;                       
WAIT_CLASS# WAIT_CLASS_ID WAIT_CLASS           count
----------- ------------- --------------- ----------
          0    1893977003 Other                  632
          1    4217450380 Application             15
          2    3290255840 Configuration           21
          3    4166625743 Administrative          51
          4    3875070507 Concurrency             26
          5    3386400367 Commit                   2
          6    2723168908 Idle                    80
          7    2000153315 Network                 35
          8    1740759767 User I/O                22
          9    4108307767 System I/O              23
         10    2396326234 Scheduler                3
         11    3871361733 Cluster                 47
         12     644977587 Queueing                 4
13 rows selected.

也可以通过查询v$system_wait_class视图获得各类主要等待事件的等待时间和等待次数等信息,通过分类以及统计信息,可以很直观地快速获得数据库的整体印象,在以下输出中,可以看出数据库的主要等待消耗在User I/O操作上:

sys@CCDB> select * from v$system_wait_class order by time_waited;
WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS      TOTAL_WAITS TIME_WAITED TOTAL_WAITS_FG TIME_WAITED_FG
------------- ----------- --------------- ----------- ----------- -------------- --------------
   2000153315           7 Network            11535832        8306       11483262           8110
   3290255840           2 Configuration        456184       25674         451609          20704
   4217450380           1 Application            3984       59682           3647          59273
    644977587          12 Queueing                 17      123524              5            265
   2396326234          10 Scheduler             64048      337478          61590         311334
   1893977003           0 Other                147742      391129          87429         301171
   3386400367           5 Commit              4112399      709998        4110596         705566
   4108307767           9 System I/O         15470338     1884575         376478           3002
   3875070507           4 Concurrency        29235041     2342427        9841084        1233264
   1740759767           8 User I/O            5517505     3054163        5167892        2632608
   2723168908           6 Idle               45845622  4.8606E+10       12138330     3.7588E+10
11 rows selected.

从Oracle 11g开始,可以通过如下查询来首先了解数据库的空闲等待事件:

select name,wait_class from v$event_name where wait_class='Idle';

在Oracle 11g中,空闲等待已经增加到80个左右。

- The End -