Oracle數(shù)據(jù)庫buffer busy wait等待事件
為了確保讀取器會話擁有與獲得所有更改或無更改的數(shù)據(jù)塊一致的映像,正在修改該數(shù)據(jù)塊的會話在其標(biāo)題中標(biāo)記一個標(biāo)志,讓其他會話知道有一個更改正在進(jìn)行而等候更改的的完成。
視圖v$waitstat不是OWI的組件,但其為沒一類緩沖區(qū)提供了有用的等待統(tǒng)計。遭遇buffer busy等待事件最常見的緩沖區(qū)類為塊、段標(biāo)題、撤消塊、撤消標(biāo)題。
顯示一個查詢v$waitstat視圖的采樣輸出:
具體示例如下:
SELECT * FROM V$waitstat WHERE COUNT>0;
CLASS COUNT TIME
------------------ ---------- ----------
data block 4170082 1668098
segment header 116 98
undo header 916 1134
undo block 2087 1681
1、等待參數(shù)
buffer wait busy的等待參數(shù)描述如下:
P1 在Oracle 8及其以后版本的數(shù)據(jù)庫里,P1顯示詢問數(shù)據(jù)塊駐留的絕對文件號。
P2 進(jìn)程需要訪問的實(shí)際塊號。
P3 在Oracle10g以前的版本中,著是表示等待原因的數(shù)字。Oracle在內(nèi)河代碼中在
多個地方用不同的原因碼提交。該原因碼取決于版本。
2、等待時間
100厘秒或1秒。
· Oracle會話正在等待釘住一個緩沖區(qū)。必須在讀取或修改緩沖區(qū)前將它釘住。在任何
時刻只有一個進(jìn)程可以釘住一個緩沖區(qū)。
·buffer busy waits表明讀/讀、讀/寫、寫/寫爭用。
·采取的適當(dāng)措施取決于P3參數(shù)中的原因碼。
在SGA中讀取或修改緩沖區(qū)的會話必須首先獲取cache buffers chains鎖存器,并且遍歷
這個緩沖區(qū)鏈,直到他發(fā)現(xiàn)必需的緩沖區(qū)頭。然后,他必須以共享模式或獨(dú)占模式獲取
一個緩沖區(qū)鎖或緩沖區(qū)頭上的pin,這取決于他計劃的操作。一旦緩沖區(qū)頭被釘住,會話
就釋放cache buffers chains鎖存器,并在緩沖區(qū)自身上執(zhí)行計劃的操作。如果無法獲
取一個pin,會話就在buffer busy waits等待事件上等待。這種等待時間不會應(yīng)用于在
會話的私有PGA中執(zhí)行的讀取或?qū)懭氩僮鳌?
3、診斷的原因、診斷和動作
·表示為什么進(jìn)程無法獲得一個緩沖區(qū)pin的主要原因碼。
·buffer busy waits等待時間需要的塊類。
·和buffer busy waits時間相關(guān)的SQL語句。
·緩沖區(qū)所屬的段。
--查找等待塊類型
SELECT 'segment Header' CLASS,
a.Segment_Type,
a.Segment_Name,
a.Partition_Name
FROM Dba_Segments a,
V$session_Wait b
WHERE a.Header_File = b.P1
AND a.Header_Block = b.P2
AND b.Event = 'buffer busy waits'
UNION
SELECT 'freelist Groups' CLASS,
a.Segment_Type,
a.Segment_Name,
a.Partition_Name
FROM Dba_Segments a,
V$session_Wait b
WHERE b.P2 BETWEEN a.Header_Block + 1 AND (a.Header_Block + a.Freelist_Groups)
AND a.Header_File = b.P1
AND a.Freelist_Groups > 1
AND b.Event = 'buffer busy waits'
UNION
SELECT a.Segment_Type || ' Block' CLASS,
a.Segment_Type,
a.Segment_Name,
a.Partition_Name
FROM Dba_Extents a,
V$session_Wait b
WHERE b.P2 BETWEEN a.Block_Id AND a.Block_Id + a.Blocks - 1
AND a.File_Id = b.P1
AND b.Event = 'buffer busy waits'
AND NOT EXISTS (SELECT 1
FROM Dba_Segments
WHERE Header_File = b.P1
AND Header_Block = b.P2);
◆ 帶有原因碼130的數(shù)據(jù)塊(類#1)爭用
如果buffer busy waits的等待事件主要集中在數(shù)據(jù)塊(類#1)上,并且原因碼130,則
表明應(yīng)用程序運(yùn)行在同一時刻查詢相同數(shù)據(jù)集的多個會話,采用如下三件事最小化問題:
§減少并發(fā)級別或該表在運(yùn)行現(xiàn)成直接內(nèi)分區(qū)工作的方法。
§優(yōu)化SQL語句,減少物理讀取和邏輯讀取的數(shù)量。
§增加freeLists和freeList Groups的數(shù)量。
◆ 帶有原因碼220的數(shù)據(jù)塊(類#1)爭用
多個會話同時在相同的對象上DML。采用如下三件事最小化問題:
減少并發(fā)級別或改變劃分部分的方法。
減少塊中行的數(shù)量。
在另一個具有較小塊尺寸的表空間中重新構(gòu)建對象(Oracle 9i或以上版本)。
可以使用較大的PCTFREE重新構(gòu)建表或索引。可以使用命令改變表以最小化每個塊的最
小行數(shù):
ALTER TABLE table_name MINIMIZE RECORDS_PER_BLOCK;
從Oracle 9i開始,可以在另外一個具有較小的塊尺寸的表空間中移動或重新構(gòu)建對象。
雖然這些動作可以最小化buffer busy waits問題,但是他們無疑將增加全表掃描時間
和磁盤空間利用率。常言道,世上沒有免費(fèi)的午餐。
◆ 數(shù)據(jù)段頭(類#4)的爭用
如果buffer busy waits的等待時間主要集中在數(shù)據(jù)段頭(即表或索引段頭,并且不是
插銷段頭)上,這意味著數(shù)據(jù)庫中的一些表或索引具有高段頭活動。如下解決問題:
增加已經(jīng)確定對象的進(jìn)程FreeLists和FreeList Groups的數(shù)量。
確保PctFree和PctUsed之間內(nèi)的間隙不會太小。
確保下一個區(qū)尺寸不會太小。
如果不希望混浠FreeLists和FreeList Groups,可以依靠自動段空間管理(Automatic
Segment Space Management,ASSM)特性,以分散從插入語句中引入的數(shù)據(jù)(9i特性)。
◆ 撤消段都(類#17)的爭用
如果buffer busy waits等待時間主要集中在撤消段頭上,這表明數(shù)據(jù)庫中的回滾段
過少,或者他們的尺寸太小,從而造成對段頭的頻繁更新。如果在Oracle 9i中引入的系
統(tǒng)管理撤消,就不需要處理這種問題,因?yàn)镺racle將根據(jù)需要增加額外的撤消段。
◆ 撤消塊的爭用(類#18)
如果buffer busy waits等待時間主要集中在撤消塊上,這通常意味著多個并發(fā)會話同
時查詢更新的數(shù)據(jù)。當(dāng)應(yīng)用程序可以在不同的時間內(nèi)查詢和DML時,這種問題就不會存在。
◆ 系統(tǒng)級診斷
--文件等待次數(shù)
SELECT b.File_Id,
b.File_Name,
a.COUNT
FROM X$kcbfwait a,
Dba_Data_Files b
WHERE a.Indx = b.File_Id-1
AND a.COUNT > 0
ORDER BY a.COUNT;
