久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

ORACLE的buffer busy wait等待事件怎么解決

141次閱讀
沒有評論

共計 2514 個字符,預計需要花費 7 分鐘才能閱讀完成。

本文丸趣 TV 小編為大家詳細介紹“ORACLE 的 buffer busy wait 等待事件怎么解決”,內容詳細,步驟清晰,細節處理妥當,希望這篇“ORACLE 的 buffer busy wait 等待事件怎么解決”文章能幫助大家解決疑惑,下面跟著丸趣 TV 小編的思路慢慢深入,一起來學習新知識吧。

1. ORACLE  訪問 Data buffer block 的過程:
1)依據數據塊的地址計算出數據塊所在的 bucket
2)獲得保護這個 bucket 的 cbc latch
3)在這個鏈表上找尋我們需要的數據塊,找到后,pin 這個 buffer(讀取 s,修改 x)
4)釋放 cbc latch
5)讀取 / 修改數據塊的內容
6)獲取 cbc latch
7)unpin 這個 buffer
8)釋放 cbc latch

2.buffer busy wait 等待事件形成原因:
(1). 讀讀
當一個 session 讀取一個 block 時,該 block 在 cache 中不存在,需要從 disk 讀取至 cache,此時其他 session 想要讀取該 block 時,就會發生 buffer busy wait 等待事件。

(2). 寫寫
當一個 session 修改 block 時,首先會對該 block 進行 buffer pin(修改 x), 因此其他 session 在對該 block 進行修改時都要等待上一個 session unpin buffer。

(3). 讀寫
1)當讀取的進程發現內存塊正在被修改的時候(如果有 x 模式的 buffer pin,就說明正在被修改),它只能等待,它不能 clone 塊,因為這個時候內存塊正在變化過程中 ing,這個時候 clone 是不安全的。很多人說,oracle 里讀寫是互相不阻塞的,oracle 可以 clone 內存塊,把讀寫的競爭分開。其實要看情況,在讀的時候發現內存塊正在被寫,是不能夠 clone 的,因為是不安全的。這個時候讀的進程只能等待 buffer busy waits。
2)當寫的進程發現內存塊正在被讀,這個時候,讀是不阻塞寫的,因為 ORACLE 可以很容易的 clone 出一個 xcur 的數據塊,然后在 clone 的塊上進行寫,這個時候 clone 是安全的,因為讀內存塊的進程不會去修改數據塊,保證了 clone 的安全性。

3.buffer busy wait 常見發生原因
(1). 性能差的 QUERY 訪問相同的 block 并發執行時,產生大量的物理讀。 
(2). freelist 設置過小,導致并發 insert table 時,頻繁掃描 freelist,產生爭用。
(3). 大量 session 并發修改相同的 index block

4. 常用解決方法
(1). tuning sql 減少物理讀
(2). 刪除一些 hot row 并重新 insert 至其他 block 中
(3). 如果 table 較小,可以考慮將其數據 cache 至 keep data buffer 中
(4). 減少 low cardinality index 的使用。避免 index block 爭用。
(5). 增加 extents size。避免 oracle 頻繁分配空間而造成的 extent map 爭用。

5. 產生等待的 block 類型及解決方法

Block Type
Possible Actions
data blocks
Eliminate HOT blocks from the application.                 Check for repeatedly scanned / unselective indexes.                 Change PCTFREE and/or PCTUSED. Check for right-                 hand-indexes (indexes that get inserted into at the                  same point by many processes). Increase INITRANS.                  Reduce the number of rows per block.
segment header
Increase of number of FREELISTs.                  Use FREELIST GROUPs (even in single instance this                  can make a difference).
freelist blocks
Add more FREELISTS. In case of Parallel Server                  make sure that each instance has its own FREELIST                  GROUP(s).
undo header
Add more rollback segments. 

6. 相關命令

 SELECT p1 File , p2 Block , p3 Reason
    FROM v$session_wait 
   WHERE event= enq: TX – row lock contention
   
select objd, file#,block#,class#,ts#,cachehint,status,dirty from v$bh where file#=546 and block#=1289912;

select * from dba_objects where object_id = 124269

select current_obj#,obj.object_name,count(*) from dba_hist_active_sess_history , dba_objects obj
where event= buffer busy waits  
and sample_time =to_date(2017-07-09 00:00:00 , yyyy-mm-dd hh34:mi:ss) 
and sample_time =to_date(2017-07-10 00:00:00 , yyyy-mm-dd hh34:mi:ss) 
and obj.data_object_id = current_obj#
group by current_obj#,obj.object_name

讀到這里,這篇“ORACLE 的 buffer busy wait 等待事件怎么解決”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計2514字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 阳朔县| 和田县| 丹棱县| 开阳县| 革吉县| 高州市| 南京市| 忻州市| 肃北| 鹿泉市| 岫岩| 甘肃省| 宁城县| 福鼎市| 平谷区| 肇州县| 武穴市| 昌乐县| 邳州市| 阿合奇县| 合阳县| 蕉岭县| 临洮县| 灯塔市| 临武县| 黎城县| 锦州市| 北流市| 宜川县| 灵山县| 吉水县| 堆龙德庆县| 井研县| 芦溪县| 宣威市| 泽州县| 瓦房店市| 花莲县| 绍兴市| 白朗县| 青铜峡市|