日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle的空闲等待事件,Oracle 常见的33个等待事件详解

發(fā)布時(shí)間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle的空闲等待事件,Oracle 常见的33个等待事件详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一. 等待事件的相關(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。