oracle的空闲等待事件,Oracle 常见的33个等待事件详解
一. 等待事件的相關(guān)知識(shí):
1.1 等待事件主要可以分為兩類,即空閑(IDLE)等待事件和非空閑(NON-IDLE)等待事件。
1). 空閑等待事件指ORACLE正等待某種工作,在診斷和優(yōu)化數(shù)據(jù)庫的時(shí)候,不用過多注意這部分事件。
2). 非空閑等待事件專門針對(duì)ORACLE的活動(dòng),指數(shù)據(jù)庫任務(wù)或應(yīng)用運(yùn)行過程中發(fā)生的等待,這些等待事件是在調(diào)整數(shù)據(jù)庫的時(shí)候需要關(guān)注與研究的。
在Oracle 10g中的等待事件有872個(gè),11g中等待事件1116個(gè)。 我們可以通過v$event_name 視圖來查看等待事件的相關(guān)信息。
1.2 查看v$event_name視圖的字段結(jié)構(gòu):
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 查看等待事件總數(shù):
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 相關(guān)的幾個(gè)視圖:
V$SESSION: 代表數(shù)據(jù)庫活動(dòng)的開始,視為源起。
V$SESSION_WAIT: 視圖用以實(shí)時(shí)記錄活動(dòng)SESSION的等待情況,是當(dāng)前信息。
V$SESSION_WAIT_HISTORY: 是對(duì)V$SESSION_WAIT的簡(jiǎn)單增強(qiáng),記錄活動(dòng)SESSION的最近10次等待。
V$SQLTEXT: 當(dāng)數(shù)據(jù)庫出現(xiàn)瓶頸時(shí),通常可以從V$SESSION_WAIT找到那些正在等待資源的SESSION,通過SESSION的SID,聯(lián)合V$SESSION和V$SQLTEXT視圖就可以捕獲這些SESSION正在執(zhí)行的SQL語句。
V$ACTIVE_SESSION_HISTORY: 是ASH的核心,用以記錄活動(dòng)SESSION的歷史等待信息,每秒采樣一次,這部分內(nèi)容記錄在內(nèi)存中,期望值是記錄一個(gè)小時(shí)的內(nèi)容。
WRH#_ACTIVE_SESSION_HISTORY : 是V$ACTIVE_SESSION_HISTORY在AWR的存儲(chǔ)地。
V$ACTIVE_SESSION_HISTORY: 中的信息會(huì)被定期(每小時(shí)一次)的刷新到負(fù)載庫中,并缺省保留一個(gè)星期用于分析。
DBA_HIST_ACTIVE_SESS_HISTORY: 視圖是WRH#_ACTIVE_SESSION_HISTORY視圖和其他幾個(gè)視圖的聯(lián)合展現(xiàn),通常通過這個(gè)視圖進(jìn)行歷史數(shù)據(jù)的訪問。
V$SYSTEM_EVENT 由于V$SESSION記錄的是動(dòng)態(tài)信息,和SESSION的生命周期相關(guān),而并不記錄歷史信息,所以O(shè)RACLE提供視圖V$SYSTEM_EVENT來記錄數(shù)據(jù)庫自啟動(dòng)以來所有等待事件的匯總信息。通過這個(gè)視圖,用戶可以迅速獲得數(shù)據(jù)庫運(yùn)行的總體概況。
二. 33個(gè)常見的等待事件
1. Buffer busy waits
從本質(zhì)上講,這個(gè)等待事件的產(chǎn)生僅說明了一個(gè)會(huì)話在等待一個(gè)Buffer(數(shù)據(jù)塊),但是導(dǎo)致這個(gè)現(xiàn)象的原因卻有很多種。常見的兩種是:
當(dāng)一個(gè)會(huì)話視圖修改一個(gè)數(shù)據(jù)塊,但這個(gè)數(shù)據(jù)塊正在被另一個(gè)會(huì)話修改時(shí)。
當(dāng)一個(gè)會(huì)話需要讀取一個(gè)數(shù)據(jù)塊,但這個(gè)數(shù)據(jù)塊正在被另一個(gè)會(huì)話讀取到內(nèi)存中時(shí)。
Oracle 操作的最小單位是塊(Block),即使你要修改一條記錄,也需要對(duì)這條記錄所在的這個(gè)數(shù)據(jù)塊做操作。 當(dāng)你對(duì)這個(gè)數(shù)據(jù)塊做修改時(shí),其他的會(huì)話將被阻止對(duì)這個(gè)數(shù)據(jù)塊上的數(shù)據(jù)做修改(即使其他用戶修改的不是當(dāng)前用戶修改的數(shù)據(jù)),但是可以以一致性的方式讀取這個(gè)數(shù)據(jù)塊(from undo)。當(dāng)前的用戶修改完這個(gè)數(shù)據(jù)塊后,將會(huì)立即釋放掉加在這個(gè)數(shù)據(jù)塊上的排他鎖,這樣另一個(gè)會(huì)話就可以繼續(xù)修改它。 修改操作是一個(gè)非常短暫的時(shí)間,這種加鎖的機(jī)制我們叫Latch。
當(dāng)一個(gè)會(huì)話修改一個(gè)數(shù)據(jù)塊時(shí),是按照以下步驟來完成的:
以排他的方式獲得這個(gè)數(shù)據(jù)塊(Latch)
修改這個(gè)數(shù)據(jù)塊。
釋放Latch。
Buffer busy waits等待事件常見于數(shù)據(jù)庫中存在的熱快的時(shí)候,當(dāng)多個(gè)用戶頻繁地讀取或者修改同樣的數(shù)據(jù)塊時(shí),這個(gè)等待事件就會(huì)產(chǎn)生。 如果等待的時(shí)間很長(zhǎng),我們?cè)贏WR或者statspack 報(bào)告中就可以看到。
這個(gè)等待事件有三個(gè)參數(shù)。 查看有幾個(gè)參數(shù)我們可以用以下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#
在下面的示例中,查詢的方法和這個(gè)一樣,所以其他事件對(duì)參數(shù)的查詢將不做過多的說明。
File#: 等待訪問數(shù)據(jù)塊所在的文件id號(hào)。
Blocks: 等待訪問的數(shù)據(jù)塊號(hào)。
ID: 在10g之前,這個(gè)值表示一個(gè)等待時(shí)間的原因,10g之后則表示等待事件的類別。
2. Buffer latch
內(nèi)存中數(shù)據(jù)塊的存放位置是記錄在一個(gè)hash列表(cache buffer chains)當(dāng)中的。 當(dāng)一個(gè)會(huì)話需要訪問某個(gè)數(shù)據(jù)塊時(shí),它首先要搜索這個(gè)hash 列表,從列表中獲得數(shù)據(jù)塊的地址,然后通過這個(gè)地址去訪問需要的數(shù)據(jù)塊,這個(gè)列表Oracle會(huì)使用一個(gè)latch來保護(hù)它的完整性。 當(dāng)一個(gè)會(huì)話需要訪問這個(gè)列表時(shí),需要獲取一個(gè)Latch,只有這樣,才能保證這個(gè)列表在這個(gè)會(huì)話的瀏覽當(dāng)中不會(huì)發(fā)生變化。
產(chǎn)生buffer latch的等待事件的主要原因是:
Buffer chains太長(zhǎng),導(dǎo)致會(huì)話搜索這個(gè)列表花費(fèi)的時(shí)間太長(zhǎng),使其他的會(huì)話處于等待狀態(tài)。
同樣的數(shù)據(jù)塊被頻繁訪問,就是我們通常說的熱快問題。
產(chǎn)生buffer chains太長(zhǎng),我們可以使用多個(gè)buffer pool的方式來創(chuàng)建更多的buffer chains,或者使用參數(shù)DB_BLOCK_LRU_LATCHES來增加latch的數(shù)量,以便于更多的會(huì)話可以獲得latch,這兩種方法可以同時(shí)使用。
這個(gè)等待事件有兩個(gè)參數(shù):
Latch addr: 會(huì)話申請(qǐng)的latch在SGA中的虛擬地址,通過以下的SQL語句可以根據(jù)這個(gè)地址找到它對(duì)應(yīng)的Latch名稱:
select * from v$latch a,v$latchname b where
addr=latch addr -- 這里的latch addr 是你從等待事件中看到的值
and a.latch#=b.latch#;
chain#: buffer chains hash 列表中的索引值,當(dāng)這個(gè)參數(shù)的值等于s 0xfffffff時(shí),說明當(dāng)前的會(huì)話正在等待一個(gè)LRU latch。
3. Control file parallel write
當(dāng)數(shù)據(jù)庫中有多個(gè)控制文件的拷貝時(shí),Oracle 需要保證信息同步地寫到各個(gè)控制文件當(dāng)中,這是一個(gè)并行的物理操作過程,因?yàn)榉Q為控制文件并行寫,當(dāng)發(fā)生這樣的操作時(shí),就會(huì)產(chǎn)生control file parallel write等待事件。
控制文件頻繁寫入的原因很多,比如:
日志切換太過頻繁,導(dǎo)致控制文件信息相應(yīng)地需要頻繁更新。
系統(tǒng)I/O 出現(xiàn)瓶頸,導(dǎo)致所有I/O出現(xiàn)等待。
當(dāng)系統(tǒng)出現(xiàn)日志切換過于頻繁的情形時(shí),可以考慮適當(dāng)?shù)卦龃笕罩疚募拇笮斫档腿罩厩袚Q頻率。
當(dāng)系統(tǒng)出現(xiàn)大量的control file parallel write 等待事件時(shí),可以通過比如降低控制文件的拷貝數(shù)量,將控制文件的拷貝存放在不同的物理磁盤上的方式來緩解I/O 爭(zhēng)用。
這個(gè)等待事件包含三個(gè)參數(shù):
Files: Oracle 要寫入的控制文件個(gè)數(shù)。
Blocks: 寫入控制文件的數(shù)據(jù)塊數(shù)目。
Requests:寫入控制請(qǐng)求的I/O 次數(shù)。
4. Control file sequential read
當(dāng)數(shù)據(jù)庫需要讀取控制文件上的信息時(shí),會(huì)出現(xiàn)這個(gè)等待事件,因?yàn)榭刂莆募男畔⑹琼樞驅(qū)懙?#xff0c;所以讀取的時(shí)候也是順序的,因此稱為控制文件順序讀,它經(jīng)常發(fā)生在以下情況:
備份控制文件
RAC 環(huán)境下不同實(shí)例之間控制文件的信息共享
讀取控制文件的文件頭信息
讀取控制文件其他信息
這個(gè)等待事件有三個(gè)參數(shù):
File#:要讀取信息的控制文件的文件號(hào)。
Block#: 讀取控制文件信息的起始數(shù)據(jù)塊號(hào)。
Blocks:需要讀取的控制文件數(shù)據(jù)塊數(shù)目。
5. Db file parallel read
這是一個(gè)很容易引起誤導(dǎo)的等待事件,實(shí)際上這個(gè)等待事件和并行操作(比如并行查詢,并行DML)沒有關(guān)系。 這個(gè)事件發(fā)生在數(shù)據(jù)庫恢復(fù)的時(shí)候,當(dāng)有一些數(shù)據(jù)塊需要恢復(fù)的時(shí)候,Oracle會(huì)以并行的方式把他們從數(shù)據(jù)文件中讀入到內(nèi)存中進(jìn)行恢復(fù)操作。
這個(gè)等待事件包含三個(gè)參數(shù):
Files: 操作需要讀取的文件個(gè)數(shù)。
Blocks: 操作需要讀取的數(shù)據(jù)塊個(gè)數(shù)。
Requests:操作需要執(zhí)行的I/O次數(shù)。
6. Db file parallel write
這是一個(gè)后臺(tái)等待事件,它同樣和用戶的并行操作沒有關(guān)系,它是由后臺(tái)進(jìn)程DBWR產(chǎn)生的,當(dāng)后臺(tái)進(jìn)程DBWR想磁盤上寫入臟數(shù)據(jù)時(shí),會(huì)發(fā)生這個(gè)等待。
DBWR會(huì)批量地將臟數(shù)據(jù)并行地寫入到磁盤上相應(yīng)的數(shù)據(jù)文件中,在這個(gè)批次作業(yè)完成之前,DBWR將出現(xiàn)這個(gè)等待事件。 如果僅僅是這一個(gè)等待事件,對(duì)用戶的操作并沒有太大的影響,當(dāng)伴隨著出現(xiàn)free buffer waits等待事件時(shí),說明此時(shí)內(nèi)存中可用的空間不足,這時(shí)候會(huì)影響到用戶的操作,比如影響到用戶將臟數(shù)據(jù)塊讀入到內(nèi)存中。
總結(jié)
以上是生活随笔為你收集整理的oracle的空闲等待事件,Oracle 常见的33个等待事件详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平稳序列的预测和拟合之单位根检验
- 下一篇: 李航《统计学习方法》之HMM隐马尔可夫模