enq:TX - index contention

myownstars發表於2011-06-07


TX-Transaction (index contention) : Lock held on an index during a split to prevent other operations on it—查詢v$enqueue_statistics
說明索引塊出現分裂,一個事務向一個資料塊插入資料,該資料塊正好發生分裂,則插入事務需要等待分裂事務(分裂事務是一個遞迴事務),通常高併發的OLTP系統。

如何分裂:
當一個事務修改索引塊上的資料,但沒有足夠的空間容納新的資料時,會將原有塊上部分資料放到一個新的資料塊上,此為索引塊分裂;

可分為:葉子節點塊分裂/枝節點分裂,以及 5-5分裂和9-1分裂
葉子節點分裂:葉子節點上沒有足夠的空間容納新插入的資料,或者沒有足夠的空間容納新的ITL slot,一個ITL slot為24B;
枝節點分裂:其下層的節點分裂,會導致在該節點上增加一條記錄指向新加的節點,當該節點空間不足時,會發生分裂;
根節點分裂:特殊的枝節點分裂,分裂需要兩個新的資料塊,將原有資料轉移至兩個新節點,原有節點上生成兩條記錄分別指向新增的資料塊

9-1分裂:事務向索引最後一個葉子節點資料塊上插入一條rowid大於或等於最大rowid的資料,且該資料塊上沒有其他未提交的事務,此時若沒有足夠的空間,則發生9-1分裂;
5-5分裂:1、新插入數值小於索引中最大值2、資料塊上沒有足夠的ITL Slot 3、新插入資料大於或等於索引中最大值,但是資料塊上還存在其他未提交的事務

9-1分裂通常為該表主要為插入操作,確保新的資料塊有最大的空閒空間;5-5分裂通常是表上併發事務多,且插入、刪除資料比較分散,需保證新老資料塊都有相當的空閒空間以容納新事務;

Pctfree在塊分裂時會被忽略

分裂事務控制
索引分裂由導致分裂的使用者事務中的遞迴事務控制的,對資源的請求和釋放都在該遞迴事務中完成;
枝節點上只有一個ITL slot,用於發生分裂時的遞迴事務;葉子節點上第一個ITL slot也是用於分裂使用;

資料塊分配
索引分裂時候,從freelist中找空閒塊;如果索引資料塊上資料全部被刪除,即會放在freelist前面,但不會從B數結構中刪除;
只要資料塊實際資料為0,不管有沒有提交,都會放到freelist上;如果此時發生分裂,該塊會被獲取,但是由於事務未提交,不會被分配,反覆如此會導致I/O增加;

Enq: TX-Index contention
當一個事務需要插入/刪除某個索引塊上的資料,而這個資料塊正在被另一個事務分裂時,則需要等待分裂完成才能修改資料
Enq: TX-allocate ITL entry
1、達到資料塊上最大事務數限制 2、遞迴事務ITL爭用,當一個事務中遞迴事務請求分裂一個索引塊時,此時正被另一個事務分裂
除了索引塊,對於表資料塊,造成該等待原因包括 initrans太少,沒有足夠的空間分配一個新的ITL slot (索引塊不會有類似問題,此情形下會發生索引塊分裂)

解決方法:需要減少索引分裂的次數
1、  減小索引大小  --選擇性強的列的放前面,減小枝節點大小;壓縮索引
2、  碎片較多的索引進行rebuild或者shrink space
3、  對於很少更新的表,使用大資料塊表空間

確認索引碎片
Analyze index index_name validate structure online;

select name,
           del_lf_rows,
           lf_rows,
           round((del_lf_rows/(lf_rows+0.0000000001))*100) frag_pct
   from index_stats
    一般如果該索引的frag_pct>10%,那麼就需要rebuild index

 

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

相關文章