oracle的空闲等待事件,Oracle 常见的33个等待事件详解
一. 等待事件的相關知識:
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 查看等待事件總數:
SQL> select count(*) from v$event_name;
COUNT(*)
----------
1116
1.4 查看等待事件分類情況:
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)。當前的用戶修改完這個數據塊后,將會立即釋放掉加在這個數據塊上的排他鎖,這樣另一個會話就可以繼續修改它。 修改操作是一個非常短暫的時間,這種加鎖的機制我們叫Latch。
當一個會話修改一個數據塊時,是按照以下步驟來完成的:
以排他的方式獲得這個數據塊(Latch)
修改這個數據塊。
釋放Latch。
Buffer busy waits等待事件常見于數據庫中存在的熱快的時候,當多個用戶頻繁地讀取或者修改同樣的數據塊時,這個等待事件就會產生。 如果等待的時間很長,我們在AWR或者statspack 報告中就可以看到。
這個等待事件有三個參數。 查看有幾個參數我們可以用以下SQL:
SQL> select name, parameter1, parameter2, parameter3 from v$event_name where name='buffer busy waits';
NAME PARAMETER1 PARAMETER2 PARAMETER3
-------------------- ---------- ---------- ----------
buffer busy waits file# block# class#
在下面的示例中,查詢的方法和這個一樣,所以其他事件對參數的查詢將不做過多的說明。
File#: 等待訪問數據塊所在的文件id號。
Blocks: 等待訪問的數據塊號。
ID: 在10g之前,這個值表示一個等待時間的原因,10g之后則表示等待事件的類別。
2. Buffer latch
內存中數據塊的存放位置是記錄在一個hash列表(cache buffer chains)當中的。 當一個會話需要訪問某個數據塊時,它首先要搜索這個hash 列表,從列表中獲得數據塊的地址,然后通過這個地址去訪問需要的數據塊,這個列表Oracle會使用一個latch來保護它的完整性。 當一個會話需要訪問這個列表時,需要獲取一個Latch,只有這樣,才能保證這個列表在這個會話的瀏覽當中不會發生變化。
產生buffer latch的等待事件的主要原因是:
Buffer chains太長,導致會話搜索這個列表花費的時間太長,使其他的會話處于等待狀態。
同樣的數據塊被頻繁訪問,就是我們通常說的熱快問題。
產生buffer chains太長,我們可以使用多個buffer pool的方式來創建更多的buffer chains,或者使用參數DB_BLOCK_LRU_LATCHES來增加latch的數量,以便于更多的會話可以獲得latch,這兩種方法可以同時使用。
這個等待事件有兩個參數:
Latch addr: 會話申請的latch在SGA中的虛擬地址,通過以下的SQL語句可以根據這個地址找到它對應的Latch名稱:
select * from v$latch a,v$latchname b where
addr=latch addr -- 這里的latch addr 是你從等待事件中看到的值
and a.latch#=b.latch#;
chain#: buffer chains hash 列表中的索引值,當這個參數的值等于s 0xfffffff時,說明當前的會話正在等待一個LRU latch。
3. Control file parallel write
當數據庫中有多個控制文件的拷貝時,Oracle 需要保證信息同步地寫到各個控制文件當中,這是一個并行的物理操作過程,因為稱為控制文件并行寫,當發生這樣的操作時,就會產生control file parallel write等待事件。
控制文件頻繁寫入的原因很多,比如:
日志切換太過頻繁,導致控制文件信息相應地需要頻繁更新。
系統I/O 出現瓶頸,導致所有I/O出現等待。
當系統出現日志切換過于頻繁的情形時,可以考慮適當地增大日志文件的大小來降低日志切換頻率。
當系統出現大量的control file parallel write 等待事件時,可以通過比如降低控制文件的拷貝數量,將控制文件的拷貝存放在不同的物理磁盤上的方式來緩解I/O 爭用。
這個等待事件包含三個參數:
Files: Oracle 要寫入的控制文件個數。
Blocks: 寫入控制文件的數據塊數目。
Requests:寫入控制請求的I/O 次數。
4. Control file sequential read
當數據庫需要讀取控制文件上的信息時,會出現這個等待事件,因為控制文件的信息是順序寫的,所以讀取的時候也是順序的,因此稱為控制文件順序讀,它經常發生在以下情況:
備份控制文件
RAC 環境下不同實例之間控制文件的信息共享
讀取控制文件的文件頭信息
讀取控制文件其他信息
這個等待事件有三個參數:
File#:要讀取信息的控制文件的文件號。
Block#: 讀取控制文件信息的起始數據塊號。
Blocks:需要讀取的控制文件數據塊數目。
5. Db file parallel read
這是一個很容易引起誤導的等待事件,實際上這個等待事件和并行操作(比如并行查詢,并行DML)沒有關系。 這個事件發生在數據庫恢復的時候,當有一些數據塊需要恢復的時候,Oracle會以并行的方式把他們從數據文件中讀入到內存中進行恢復操作。
這個等待事件包含三個參數:
Files: 操作需要讀取的文件個數。
Blocks: 操作需要讀取的數據塊個數。
Requests:操作需要執行的I/O次數。
6. Db file parallel write
這是一個后臺等待事件,它同樣和用戶的并行操作沒有關系,它是由后臺進程DBWR產生的,當后臺進程DBWR想磁盤上寫入臟數據時,會發生這個等待。
DBWR會批量地將臟數據并行地寫入到磁盤上相應的數據文件中,在這個批次作業完成之前,DBWR將出現這個等待事件。 如果僅僅是這一個等待事件,對用戶的操作并沒有太大的影響,當伴隨著出現free buffer waits等待事件時,說明此時內存中可用的空間不足,這時候會影響到用戶的操作,比如影響到用戶將臟數據塊讀入到內存中。
總結
以上是生活随笔為你收集整理的oracle的空闲等待事件,Oracle 常见的33个等待事件详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平稳序列的预测和拟合之单位根检验
- 下一篇: 李航《统计学习方法》之HMM隐马尔可夫模