buffer busy waits 等待事件

2021-09-05 20:45:48 字數 2904 閱讀 9904

事件引數說明:

事件號:145

事件名:buffer busy waits

引數一:file#

引數二:block#

引數三:9i -原因碼,

10g- block class#

事件說明:

一、oracle會話正在等待pin住乙個緩衝區,會話必須在讀取或修改緩衝區之前將該緩衝區pin住。

二、在任何時侯只有乙個程序可以pin住乙個緩衝區。

三、buffer busy waits表明讀/讀、讀/寫、寫/寫爭用。

四、根據p3中指明的原因碼有不同的處理方式。

五、現象描述:

會話在sga中讀取或修改緩衝區之前,必須要先獲取cahce buffers chains鎖存器,獲取後然後遍歷這個緩衝區鏈,直到發現它需要的緩衝區頭。然後以共享方式或獨佔方式獲取該緩衝區鎖或緩衝區頭部的pin,一旦緩衝區被pin住,會話即釋放cache buffers chains鎖存器。如果無法獲得pin,會話就在buffer busy waits等待事件上等待。

六、該事件只與sga中緩衝區相關,與會話私有的pga中執行的讀/寫操作無關。

七、處理該等待事件時主要注意以下四方面:

1) 該等待事件主要的原因碼是什麼?(引數p3)

2) buffer busy waits事件需要的塊類?(由p1即可找出等待塊的類列)

3) 緩衝區所屬的段(由p1和p2引數配合檢視v$extents即可找出等待塊的所屬段)

select s.segment_name, s.partition_name

from dba_extents s

where

帶有原因碼130的資料塊(類#1)爭用

1) 等待集中在資料塊上,並且原因碼是130,則意味著多個會話併發請求相同的資料塊,但該資料塊並不在緩衝儲存器中,並且必須從磁碟讀取。

2) 當多個會話請求不在緩衝儲存器中的相同資料塊時,oracle可以聰明地防止每個會話進行相同的作業系統i/o呼叫。否則,這可能嚴重地增加系統i/o的數量,所以,oracle只允許乙個會話執行實際的i/o,而其他的會話在buffer busy waits上等待塊,執行i/o的會話在db file sequential read或db file scattered read等待事件上等待。

3) 可在v$session檢視中檢查session的註冊時間,並且等待事件db file sequential(scattered) read和buffer busy waits等待相同的檔案號和塊號。

4) 解決方法:優化

sql語句,盡可能地減少邏輯讀和物理讀;

帶有原因碼220的資料塊(類#1)爭用

1) 等待集中在資料塊上,並且原因碼是220,則意味著多個會話同時在相同的物件上執行dml(相同塊中的不同行)。

2) 如果資料塊的尺寸較大(>=16k),則可能強化這種現象,因為較大的塊一般在每個塊中包含更多的行。

3) 減少這種情況的等待的方法:減少併發;減少塊中行的數量;在另乙個具有較小塊尺寸的表空間中重新構建物件。

4) 具體方法說明:

使用較大的pctfree重新構建表或索引;

使用alter table minimize records_pre_block命令改變表以最小化每個塊的最小行數

從oracle9i開始,可以在另乙個具有較小塊尺寸的表空間中移動或重新構建物件。

注:雖然這些方法可以最小化buffer busy waits問題,但它們無疑會增加全表掃瞄時間和磁碟空間利用率。

資料段頭(類#4)的爭用

1) 如果buffer busy waits的等待事件主要集中在資料段頭(即表或索引段頭,並且不是undo段頭)上,這意味著

資料庫中一些表或索引有高段頭活動。

注:程序出於兩個主要原因訪問段頭,一是,獲得或修改freelists資訊;二是,為了擴充套件高水位標記(hwm)。

2) 減少這種情況的等待的方法:

>> 對使用自由表進行段

管理的表,增加確認物件的freelists和freelist groups(注:freelist groups的增加也是必須的);

>> 確保fctfree和pctused之間的間隙不是太小,從而可以最小化freelist的塊迴圈。

>> 下一區的尺寸不能太小,當區高速擴張時,建立的新區需要修改在段頭中區對映表。可以考慮將物件移動到合理的、統一尺寸的本地管理的表空間中。

撤銷段頭(類#17)的爭用

1) 如果buffer busy waits等待事件主要集中在撤銷段頭,這表明資料庫中的回滾段過少或者是它們的區尺寸太小,從而造成對段頭的頻繁更新。如果使用oracle9i的由資料庫系統管理undo段,就不需要處理這種問題,因為oracle會根據需要增加額外的的undo段。

2) 可以建立並啟用私有回滾段,以減少每個回滾段的事務數量。需要修改init.ora檔案中的rollback_segments引數。

3) 如果使用公用回滾段可以減少初始化引數transactions_per_rollback_segment的值,oracle通過transactions/transactions_per_rollback_segment來獲取公有回滾段的最小數量。

撤銷塊的爭用(類#18)

1) 如果buffer busy waits等待事件主要集中在撤銷塊上,這表明有多個併發會話為保證一致性讀同時查詢更新的資料。

2) 這是應用程式存在問題,當應用程式在不同時間內執行查詢和dml時,這種問題不會存在。

附註:一、檢視系統所有段的有關buffer busy waits事件的統計:

select *

from v$segment_statistics s

where s.statistic_name = 'buffer busy waits'

and s.owner <> 'sys'

等待事件 buffer busy waits

事件引數說明 事件號 145 事件名 buffer busy waits 引數一 file 引數二 block 引數三 9i 原因碼,10g block class 事件說明 一 oracle會話正在等待pin住乙個緩衝區,會話必須在讀取或修改緩衝區之前將該緩衝區pin住。二 在任何時侯只有乙個程序...

比爾蓋茨 有種事你永遠不能等待!

一日,某記者採訪世界首富比爾 蓋茨,問他 最不能等待的事情是什麼?他回答說 世界上最不能等待的事情莫過於孝敬父母!他的回答突然觸痛了我的心靈。乙個視時間為金錢的商人,沒有回答是 商機 實在令我等凡夫俗子心虛汗顏。想想自己,說來真是慚愧,其實我也有很多時間可以空出來,但每次放長假父母問我是否回家時,我...

人生中不能等待的三件事

一.貧困 貧困不能去等待.當時間久了,你會習慣上貧窮,你會沒有辦法突破自己,這將會擊碎你的夢想,你甚至沒辦法達到乙個不錯的生活水平.二.夢想夢想不能去等待.生命會有不同的階段,經歷和思維方式.思考一下這個問題 如果你20歲的夢想在60歲才得以實現,當時的情形會是怎樣?比如,你20歲時的夢想是擁有一輛...