enq: TX - index contention基礎理論
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- enq:TX - index contentionENQIndex
- enq: TX - index contentionENQIndex
- enq: TX - index contention等待ENQIndex
- 故障排除 | enq:TX - index contention等待事件ENQIndex事件
- Troubleshooting 'enq: TX - index contention' WaitsENQIndexAI
- 如何解決enq: TX- index contentionENQIndex
- enq: TX - index contention故障修復一例ENQIndex
- 'enq: TX - index contention' Waits in a RAC Environment. [ID 873243.1]ENQIndexAI
- enq: TX - row lock contentionENQ
- enq: TX - row lock contention等待事件處理ENQ事件
- 【MOS】Troubleshooting 'enq: TX - index contention' Waits (文件 ID 873243.1)ENQIndexAI
- zt_Oracle enq: TX contention 和 enq: TM contention 等待事件OracleENQ事件
- 關於enq: TX - index contention 等待的探討與測試ENQIndex
- 等待事件enq: TX - row lock contention事件ENQ
- 【等待事件】-enq: TX - row lock contention事件ENQ
- 奇異的enq: TX - row lock contentionENQ
- 等待事件enq TX row lock contention分析事件ENQ
- AWR實戰分析之----enq: TX - row lock contentionENQ
- Oracle Enqueues Wait Events 三 enq: TX - row lock contentionOracleENQAI
- enq: TX – row lock contention的測試和案例分析ENQ
- 無關的表引起的enq: TX - row lock contentionENQ
- 關於enq: TX - row lock contention行鎖的總結ENQ
- 20161208理解enq TX - row lock contentionENQ
- ORACLE 歸檔空間滿導致的enq: TX - row lock contentionOracleENQ
- 使用oradebug dump processstate 來診斷enq: TX - row lock contentionENQ
- enq: HW - contention 問題的處理ENQ
- enq: US - contentionENQ
- enq: HW - contentionENQ
- enq: TM - contentionENQ
- enq:TM contentionENQ
- enq: DX - contentionENQ
- enq: TS - contentionENQ
- enq: SQ - contention 等待事件處理辦法ENQ事件
- 一次資料庫相關操作卡住的排查--enq: TX - row lock contention資料庫ENQ
- enq: TX - allocate ITL entryENQ
- 關於enq: US – contentionENQ
- enq: WF - contention等待事件ENQ事件
- enq: CF - contention 等待事件ENQ事件