【Oracle概念】-等待事件

sdon發表於2010-12-08

原創文章,轉載請註明: 轉載自
本文連結地址:

等待事件:

很長時間以來,透過什麼樣的手段來衡量資料庫的狀況,發現資料庫的問題,最佳化資料庫的效能一直是人們廣為爭論的話題。從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個左右。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/645199/viewspace-681225/,如需轉載,請註明出處,否則將追究法律責任。

相關文章