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 contention等待事件ENQIndex事件
- enq: TX - index contention故障修復一例ENQIndex
- enq: TX - row lock contentionENQ
- 等待事件enq: TX - row lock contention事件ENQ
- 奇異的enq: TX - row lock contentionENQ
- Oracle Enqueues Wait Events 三 enq: TX - row lock contentionOracleENQAI
- 故障處理】佇列等待之enq: US - contention案例佇列ENQ
- 【故障處理】佇列等待之enq: US - contention案例佇列ENQ
- Oracle等待事件之enq: TM – contentionOracle事件ENQ
- oracle等待事件之enq: CF – contentionOracle事件ENQ
- [20220518]enq FU - contention等待事件.txtENQ事件
- enq: TX - allocate ITL entry等待事件分析ENQ事件
- 效能問題,AWR High Event enq: US - contentionENQ
- 關於enq: TX - allocate ITL entry等待事件ENQ事件
- oracle 11.2.0.4 rac叢集等待事件enq: TM - contentionOracle事件ENQ
- WEB基礎理論Web
- 基礎理論01
- Hive理論基礎Hive
- Zookeeper基礎理論
- ORACLE 如何診斷高水位爭用(enq: HW – contention)OracleENQ
- diffusion model 理論基礎
- 軟體測試理論(1)基礎理論
- [20200120]oracle wait event "enq: SQ – contention" and DBA_DB_LINK_SOURCES.txtOracleAIENQ
- [20231026]enq TX - allocate ITL entry的測試4.txtENQ
- 棧與佇列理論基礎佇列
- camera理論基礎和工作原理
- 平衡車相關理論基礎
- 軟體測試基礎理論
- 論基礎理論知識的重要性
- (1)分散式事務理論基礎分散式
- Oracle優化案例-系統切換引起的enq: SQ - contention(二十八)Oracle優化ENQ
- enq: TM - contention解決之道——外來鍵無索引導致鎖爭用ENQ索引
- ¡Hola Euler! 圖資料庫的理論基礎:圖論資料庫圖論
- Django基礎之六(模型理論知識)Django模型
- Spring理論基礎-面向切面程式設計Spring程式設計
- 分散式系統理論基礎2 :CAP分散式
- 搞基礎理論研究有什麼用?
- 分散式系統的經典基礎理論分散式