故障排除 | enq:TX - index contention等待事件

沃趣科技發表於2019-03-11

當一個事務對一個索引塊做DML時,由於該索引塊沒有空閒空間導致索引塊分裂,這時其他事務正在向這個索引塊做DML時就會產生等待,直到這個索引塊分裂完成。

以下是發生索引分裂競爭的幾種場景:

1)通常情況下分裂一個索引塊是毫秒級的,如果某個會話長時間持有鎖,也就是說該會話分裂索引塊時間長,那麼就需要查該會話的等待事件和讀取的物件,很可能是在點陣圖塊中尋找一個可用的空塊而消耗了更多的時間;

2)應用程式併發數大時導致了熱塊競爭,通常伴隨著gc類的等待一起發生;

3)在RAC環境中,由於全域性緩衝塊和全域性佇列的爭用,當私網傳輸有效能瓶頸時會發生,比如私網流量大或者傳輸時有丟失的情況而導致不能快速申請到空的索引塊,通常伴隨著gc類的等待一起發生。


明確了發生索引分裂競爭的原因後就需要檢查是哪個物件發生了等待,從AWR中確認

Segments by RowLock Waits

% of Capture shows% of row lock waits for each top segment compared

with total rowlock waits for all segments captured by the Snapshot

此外,還可以從AWR中找出是哪類的分裂

Instance Activity Stats

Ordered by statistic name

按照分裂物件分:

1)根節點分裂:特殊的枝節點分裂,分裂需要兩個新的資料塊,將原有資料轉移至兩個新節點,原有節點上生成兩條記錄分別指向新增的資料塊

2)枝節點分裂:其下層的葉節點分裂,會導致在該節點上增加一條記錄指向新加的節點,當該節點空間不足時會發生分裂

3)葉節點分裂:葉子節點上沒有足夠的空間容納新插入的資料

按照分裂資料塊比例分:

1)9-1分裂:通常是主鍵單向增長型索引,當事務向索引塊的最右側的葉節點上插入一條大於或等於現有索引塊上最大值的資料

2)5-5分裂:通常是普通索引,當事務向索引塊新插入數值小於索引中最大值

 

解決方法:

1)針對第一種場景,定期重建索引;

2)針對第二種場景,建立反向鍵索引,反向鍵可以消除索引分裂競爭,而它的缺點是它可能影響索引範圍掃描的效能。除此之外,還可以將索引改造為HASH分割槽(通常分割槽數8個即可),目的是通過HASH演算法將遞增的索引鍵值分佈到多個分割槽上,從而避免insert或update時索引分裂競爭;

3)針對第三種場景,如果是私網流量大就需要分析SQL是否可以優化,如果是網路有丟包現象就需要通過系統網路層分析。

 

索引分裂如何找到一個空閒的塊:

Oracle的空間管理模組(後設資料)會在點陣圖塊BITMAPBLOCK(L3、L2、L1)中使用五種狀態來描述資料塊的空間使用情況,以便當插入資料時可以從中挑選可用空塊來重用(找不到再擴充套件),五種狀態如下表示:

1)0~25% free

2)25~50% free

3)50~75% free

4)75~100% free   --塊中有75%~100%的空閒空間

5)Full Blocks      --塊沒有任何空間,不允許充當空塊

點陣圖塊裡是沒有一個狀態是表示一個資料塊是完全空塊,只有"75~100% free"狀態的空塊。如果要插入的資料正好處於"75~100%free"大小,則將從點陣圖塊中查詢一個狀態是"75~100% free"的資料塊,然後使用該資料塊;如果要插入的資料正好處於"75~100% free",而且也尋找到一個"75~100%free"的資料塊,但是因為無法將資料插入到該資料塊,Oracle就會將該塊的點陣圖資訊更新為full狀態(儘管該塊還有剩餘的空間),後續插入資料就不會再來使用該資料塊。


| 作者簡介

管海濤·沃趣科技高階資料庫工程師

熟悉Oracle資料庫內部機制,豐富的資料庫及RAC叢集層故障診斷、效能調優、OWI、資料庫備份恢復及遷移經驗。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2638033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章