enq: TX - index contention基礎理論

你好我是李白發表於2020-01-09

enq: TX - index contention

Occurs when a transaction inserting a row in an index has to wait for the end of an index block split being done by another transaction.

索引分裂發生在當一個索引條目要插入索引塊時,發現索引塊滿了,則會發生索引分裂,有如下幾個重要基礎概念:

1.索引在建立時會設定pct_free用來為索引未來插入適當的值以及更新做保留空間。

2.索引建立後,會首先按照8個塊64k的extent分配空間,16個8個塊之後,會按照128個塊1M來分配extent,分配之後,會在段頭點陣圖塊來記錄塊free list,free list可以用做index block split。

4.索引鍵值update,其實並不是像表update一樣更新,而是刪除舊的索引鍵值,插入新的索引鍵值。

5.索引的pct_free只在建立索引或者rebuild時計算,這就意味著當索引建立之後,pct_free實際上是被忽略的,索引會在塊中一直插入資料直到達到full狀態,所以下面索引塊滿了,即表示塊真的滿了。

4.當索引鍵值單調遞增時,當highest value插入時,發現葉子塊滿了之後,會發生9-1分裂,表示臨近highest value的塊99% full,儲存highest value的索引快nearly empty,所以單調遞增的索引,建議pct_free設定為0,這樣可以防止空間由於9-1分裂導致浪費掉pct_free,這是由於索引單調遞增,舊的塊中資料如果發生

5.當索引所在的表插入資料時,如果在索引鍵值highes value左側大量插入時,如果索引塊滿了之後會發生5-5分裂,即兩個塊各有50%的索引資料,由此可見,頻繁發生5-5分裂將大大的浪費空間,造成索引虛胖,5-5分裂、9-1分裂都會大大的影響效能。

常見發生索引分裂情形:

1.索引擁有很高的資料變化量,這個不難理解,當資料變化頻繁,需要頻繁維護索引時,索引塊會頻繁的被刪除,插入,分裂。

2.單調遞增的索引,將頻繁發生9-1分裂。

3.大量刪除資料之後,又大量載入資料,將會很大程度發生兩種索引分裂。

所以針對上述情況,建議如下:

1.即可以使用reverse建立反向索引或者建立hash索引,預留足夠的pct_free,這樣資料較為均衡的被打散且有足夠空間用來維護索引,這樣可以大大的避免index block split。

缺點:會造成index range scan不可能,降低sql效能,排序等受影響。

2.單調遞增的列,如果使用了sequence,適當的增大cache值,如果可以rac情況下使用noorder sequence不同例項使用不同範圍序列值,可能一定程度減少爭用,提高效能。

3.大量資料載入建議,rebuild或者shrink索引,減少空間浪費,減少索引掃描塊數量。

4.建立索引或者rebuild時適當增大pct_free,可以延緩發生索引塊分裂,用空間換取一定效能提升。


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

相關文章