中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle中有哪些等待事件

發布時間:2021-08-13 14:37:17 來源:億速云 閱讀:148 作者:Leah 欄目:數據庫

這篇文章給大家介紹Oracle中有哪些等待事件,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1. Buffer busy waits

從本質上講,這個等待事件的產生僅說明了一個會話在等待一個 Buffer(數據塊),但是導致這個現象的原因卻有很多種。常見的兩種是:

-- 當一個會話視圖修改一個數據塊,但這個數據塊正在被另一個會話修改時。

-- 當一個會話需要讀取一個數據塊,但這個數據塊正在被另一個會話讀取到內存中時。

在新的版本中,第二種情況已經被獨立出來,以 read by other session 取代~

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#

2.Buffer  latch

內存中數據塊的存放位置是記錄在一個 hash 列表(cache buffer chains)當中的。 當一個會話需要訪問某個數據塊時,它首先要搜索這個 hash 列表,從列表中獲得數據塊的地址,然后通過這個地址去訪問需要的數據塊,這個列表 Oracle 會使用一個 latch 來保護它的完整性。 當一個會話需要訪問這個列表時,需要獲取一個 Latch,只有這樣,才能保證這個列表在這個會話的瀏覽當中不會發生變化。

產生 buffer latch 的等待事件的主要原因是:

Buffer chains 太長,導致會話搜索這個列表花費的時間太長,使其他的會話處于等待狀態。

同樣的數據塊被頻繁訪問,就是我們通常說的熱快問題。

這個等待事件有兩個參數:

Latch addr: 會話申請的 latch 在 SGA 中的虛擬地址,通過以下的 SQL 語句可以根據這個地址找到它對應的 Latch 名稱:

select * from v$latch a,v$latchname b where 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 出現等待。

這個等待事件包含三個參數:

--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 等待事件時,說明此時內存中可用的空間不足,這時候會影響到用戶的操作,比如影響到用戶將臟數據塊讀入到內存中。當出現 db file parallel write 等待事件時,可以通過啟用操作系統的異步 I/O 的方式來緩解這個等待。 當使用異步 I/O 時,DBWR 不在需要一直等到所有數據塊全部寫入到磁盤上,它只需要等到這個數據寫入到一個百分比之后,就可以繼續進行后續的操作。

這個等待事件有兩個參數:

--Requests: 操作需要執行的 I/O 次數。

--Timeouts:等待的超時時間。

7.Db file scattered read

這個等待事件在實際生產庫中經常可以看到,這是一個用戶操作引起的等待事件,當用戶發出每次 I/O 需要讀取多個數據塊這樣的 SQL 操作時,會產生這個等待事件,最常見的兩種情況是全表掃描(FTS: Full Table Scan)和索引快速掃描(IFFS: index fast full scan)。

這個名稱中的 scattered(發散),可能會導致很多人認為它是以 scattered 的方式來讀取數據塊的,其實恰恰相反,當發生這種等待事件時,SQL 的操作都是順序地讀取數據塊的,比如 FTS 或者 IFFS 方式(如果忽略需要讀取的數據塊已經存在內存中的情況)。這里的 scattered 指的是讀取的數據塊在內存中的存放方式,他們被讀取到內存中后,是以分散的方式存在在內存中,而不是連續的。

這個等待事件有三個參數:

--File#: 要讀取的數據塊所在數據文件的文件號。

--Block#: 要讀取的起始數據塊號。

--Blocks:需要讀取的數據塊數目。

8.Db file sequential read

這個等待事件在實際生產庫也很常見,當 Oracle 需要每次 I/O 只讀取單個數據塊這樣的操作時,會產生這個等待事件。 最常見的情況有索引的訪問(除 IFFS 外的方式),回滾操作,以 ROWID 的方式訪問表中的數據,重建控制文件,對文件頭做 DUMP 等。這里的 sequential 也并非指的是 Oracle 按順序的方式來訪問數據,和 db file scattered read 一樣,它指的是讀取的數據塊在內存中是以連續的方式存放的。

這個等待事件有三個參數:

--File#: 要讀取的數據塊鎖在數據文件的文件號。

--Block#: 要讀取的起始數據塊號。

--Blocks:要讀取的數據塊數目(這里應該等于 1)。

9.Db file single write

這個等待事件通常只發生在一種情況下,就是 Oracle 更新數據文件頭信息時(比如發生 Checkpoint)。當這個等待事件很明顯時,需要考慮是不是數據庫中的數據文件數量太大,導致 Oracle 需要花較長的時間來做所有文件頭的更新操作(checkpoint)。

這個等待事件有三個參數:

--File#: 需要更新的數據塊所在的數據文件的文件號。

--Block#:需要更新的數據塊號。

--Blocks:需要更新的數據塊數目(通常來說應該等于 1)。

10.Direct path read

這個等待事件發生在會話將數據塊直接讀取到 PGA 當中而不是 SGA 中的情況,這些被讀取的數據通常是這個會話私有的數據,所以不需要放到 SGA 作為共享數據,因為這樣做沒有意義。 這些數據通常是來自與臨時段上的數據,比如一個會話中 SQL 的排序數據,并行執行過程中間產生的數據,以及 Hash Join,merge join 產生的排序數據,因為這些數據只對當前的會話的 SQL 操作有意義,所以不需要放到 SGA 當中。當發生 direct path read 等待事件時,意味著磁盤上有大量的臨時數據產生,比如排序,并行執行等操作。 或者意味著 PGA 中空閑空間不足。

這個等待事件有三個參數:

--Descriptor address:       一個指針,指向當前會話正在等待的一個 direct read I/O。

--First dba: descriptor address 中最舊的一個 I/O 數據塊地址。

--Block cnt: descriptor address 上下文中涉及的有效的 buffer 數量。

11.Direct path write

這個等待事件和 direct path read 正好相反,是會話將一些數據從 PGA 中直接寫入到磁盤文件上,而不經過 SGA。

這種情況通常發生在:

-- 使用臨時表空間排序(內存不足)

-- 數據的直接加載(使用 append 方式加載數據)

-- 并行 DML 操作。

這個等待事件有三個參數:

--Descriptor address: 一個指針,指向當前會話正在等待的一個 direct I/O.

--First dba: descriptor address 中最舊的一個 I/O 數據塊地址。

--Block cnt: descriptor address 上下文中涉及的有效地 buffer 數量。

12.Enqueue

Enqueue 這個詞其實是 lock 的另一種描述語。當我們在 AWR 報告中發現長時間的 enqueue 等待事件時,說明數據庫中出現了阻塞和等待,可以關聯 AWR 報告中的 enqueue activity 部分來確定是哪一種鎖定出現了長時間等待。

這個等待事件有 2 個參數:

--Name: enqueue 的名稱和類型。

--Mode: enqueue 的模式。

13.Free buffer waits

當一個會話將數據塊從磁盤讀到內存中時,它需要到內存中找到空閑的內存空間來存放這些數據塊,當內存中沒有空閑的空間時,就會產生這個等待;除此之外,還有一種情況就是會話在做一致性讀時,需要構造數據塊在某個時刻的前映像(image),此時需要申請內存來存放這些新構造的數據塊,如果內存中無法找到這樣的內存塊,也會發生這個等待事件。

當數據庫中出現比較嚴重的 free buffer waits 等待事件時,可能的原因是:

--data buffer 太小,導致空閑空間不夠

-- 內存中的臟數據太多,DBWR 無法及時將這些臟數據寫到磁盤中以釋放空間

這個等待事件包含 2 個參數:

--File#: 需要讀取的數據塊所在的數據文件的文件號。

--Block#: 需要讀取的數據塊塊號。

-- 查詢阻塞的語句:

SELECT /*+ ORDERED USE_HASH(H,R) */     h.sid hold_sid, holds.username h_user, holds.lockwait h_lockwait, holds.status h_status, holds.module h_module, holds.row_wait_obj# h_obj, holds.row_wait_row# h_row,     r.sid wait_sid, waits.username w_user, waits.lockwait w_lockwait, waits.status w_status, waits.module w_module, waits.row_wait_obj# w_obj, waits.row_wait_row# w_row,     h.type h_type, h.id1 h_id1, h.id2 h_id2, h.lmode h_lmode, h.request h_request, h.ctime h_ctime, h.block h_block, r.type r_type, r.id1 r_id1, r.id2 r_id2, r.lmode r_lmode,     r.request r_request, r.ctime r_ctime, r.block r_block,'alter system kill session'''|| holds.sid ||','|| holds.serial# ||'''; -- kill -9'|| nvl(holdp.spid,'null') killhold,    holdsql.sql_text hsql, waitsql.sql_text wsql    FROM   v$lock    h,           v$lock    r,           v$session holds,           v$session waits,           v$process holdp,           v$sqlarea holdsql,           v$sqlarea waitsql     WHERE h.BLOCK =1 AND   r.BLOCK=0 AND  h.TYPE <>'MR' AND r.TYPE <>'MR' AND h.id1 = r.id1 AND h.id2 = r.id2 AND h.sid = holds.sid AND r.sid = waits.sid AND  holds.paddr = holdp.addr(+)     AND  holds.sql_address = holdsql.address(+) AND holds.sql_hash_value = holdsql.hash_value(+) AND  waits.sql_address = waitsql.address(+) AND waits.sql_hash_value = waitsql.hash_value(+);

14.Latch free

在 10g 之前的版本里,latch free 等待事件代表了所有的 latch 等待,在 10g 以后,一些常用的 latch 事件已經被獨立了出來:

這個等待事件有三個參數:

--Address: 會話等待的 latch 地址。

--Number: latch 號,通過這個號,可以從 v$latchname 視圖中找到這個 latch 的相關的信息。

15.Library cache lock

這個等待時間發生在不同用戶在共享中由于并發操作同一個數據庫對象導致的資源爭用的時候,比如當一個用戶正在對一個表做 DDL 操作時,其他的用戶如果要訪問這張表,就會發生 library cache lock 等待事件,它要一直等到 DDL 操作完成后,才能繼續操作。

這個事件包含四個參數:

--Handle address: 被加載的對象的地址。

--Lock address: 鎖的地址。

--Mode: 被加載對象的數據片段。

--Namespace: 被加載對象在 v$db_object_cache 視圖中 namespace 名稱。

關于Oracle中有哪些等待事件就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中卫市| 勐海县| 连城县| 丰原市| 曲麻莱县| 娱乐| 钟山县| 井陉县| 邵阳县| 涿鹿县| 长沙市| 元江| 潮州市| 海阳市| 县级市| 澄江县| 昭觉县| 昌平区| 中山市| 手机| 尚志市| 四川省| 怀安县| 康平县| 樟树市| 阿图什市| 绵竹市| 五台县| 凯里市| 广南县| 广西| 临泽县| 石阡县| 通州市| 金华市| 沧源| 宁都县| 章丘市| 涿鹿县| 忻州市| 丽水市|