一. 等待事件的相關知識
1.1 等待事件主要可以分為兩類,即空閒(IDLE)等待事件和非空閒(NON-IDLE)等待事件。
1). 空閒等待事件指ORACLE正等待某種工作,在診斷和優化數據庫的時候,不用過多注意這部分事件。
2). 非空閒等待事件專門針對ORACLE的活動,指數據庫任務或應用運行過程中發生的等待,這些等待事件 是在調整數據庫的時候需要關注與研究的。
在Oracle 10g中的等待事件有872個,11g中等待事件1116個。 我們可以通過v$event_name 視圖來查看等待事件的相關信息。
1.2 查看v$event_name視圖的字段結構
SQL> desc v$event_name;
名稱 是否為空? 類型
----------------------------------------- -------- ---------------
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)
1.3 查看等待事件總數
11gr2:
SQL> select count(*) from v$event_name;
COUNT(*)
----------
1116
10gr2 rac:
sys@ORCL> select count(*) from v$event_name;
COUNT(*)
----------
889
10gr2:
SQL> select count(*) from v$event_name;
COUNT(*)
----------
874
1.4 查看等待事件分類情況
/* Formatted on 6/27/2011 12:54:45 PM (QP5 v5.114.809.3010) */
SELECT wait_class#,
wait_class_id,
wait_class,
COUNT ( * ) AS "count"
FROM v$event_name
GROUP BY wait_class#, wait_class_id, wait_class
ORDER BY wait_class#;
WAIT_CLASS# WAIT_CLASS_ID WAIT_CLASS count
----------- ------------- -------------------- ----------
0 1893977003 Other 717
1 4217450380 Application 17
2 3290255840 Configuration 24
3 4166625743 Administrative 54
4 3875070507 Concurrency 32
5 3386400367 Commit 2
6 2723168908 Idle 94
7 2000153315 Network 35
8 1740759767 User I/O 45
9 4108307767 System I/O 30
10 2396326234 Scheduler 7
11 3871361733 Cluster 50
12 644977587 Queueing 9
1.5 相關的幾個視圖
V$SESSION:代表數據庫活動的開始,視為源起。
V$SESSION_WAIT:視圖用以實時記錄活動SESSION的等待情況,是當前信息。
V$SESSION_WAIT_HISTORY:是對V$SESSION_WAIT的簡單增強,記錄活動SESSION的最近10次等待。
V$SQLTEXT:當數據庫出現瓶頸時,通常可以從V$SESSION_WAIT找到那些正在等待資源的SESSION,
通過SESSION的SID,聯合V$SESSION和V$SQLTEXT視圖就可以捕獲這些SESSION正在執行的SQL語句。
V$ACTIVE_SESSION_HISTORY:是ASH的核心,用以記錄活動SESSION的歷史等待信息,每秒采樣一次,這部分內容記錄在內存中,期望值是記錄一個小時的內容。
WRH#_ACTIVE_SESSION_HISTORY: 是V$ACTIVE_SESSION_HISTORY在AWR的存儲地。
V$ACTIVE_SESSION_HISTORY中 的信息會被定期(每小時一次)的刷新到負載庫中,並缺省保留一個星期
用於分析。
DBA_HIST_ACTIVE_SESS_HISTORY:視圖是WRH#_ACTIVE_SESSION_HISTORY視圖和其他幾個視圖的聯合展現,通常通過這個視圖進行歷史數據的訪問。
V$SYSTEM_EVENT: 由於V$SESSION記錄的是動態信息,和SESSION的生命周期相關,而並不記錄歷史信
息,所以ORACLE提供視圖V$SYSTEM_EVENT來記錄數據庫自啟動以來所有等待事件的匯總信息。通過這個視圖,用戶可以迅速獲得數據庫運行的總體概況。
二. 33個常見的等待事件
1. Buffer busy waits
從本質上講,這個等待事件的產生僅說明了一個會話在等待一個Buffer(數據塊),但是導致這個現象的原因卻有很多種。
常見的兩種是:
· 當一個會話試圖修改一個數據塊,但這個數據塊正在被另一個會話修改時。
· 當一個會話需要讀取一個數據塊,但這個數據塊正在被另一個會話讀取到內存中時。
Oracle 操作的最小單位是塊(Block),即使你要修改一條記錄,也需要對這條記錄所在的這個數據塊做操作。 當你對這個數據塊做修改時,其他的會話將被阻止對這個數據塊上的數據做修改(即使其他用戶修改的不是當前用戶修改的數據),但是可以以一致性的方式讀取這 個數據塊(from undo)。當前的用戶修改完這個數據塊