oracle index contention,Index Contention等待
l表被刪除后的空間是可以被重用的, (pctused對表塊有影響,塊上刪除后的空間可以重用。pctfree給表塊未來的update留空間)
索引被刪除只加了刪除標記,不能被重用。(除非該葉子快的所有索引都被標記為刪除,即100% free的index block才能被放到freelist里面重用。或者雖然不是全空的,但是后續插入的行與原來的行的索引值是同一個值或者同范圍。)
(pctused對索引塊沒有影響,因為索引記錄被刪除后的空間不能重用)
(pctfree對于索引塊實際不是給update留空間而是給insert留空間,索引update:是先刪除(加刪除標記)+insert插入(新的塊)。 而索引總是有序的,insert某值可能位于已有的塊中間(對于非右增長的))
過多的dml操作使得索引變得松散(rebuild)
l重建索引:
1,有可能會降低btree的level
2,松散的索引變得緊湊
lASSM(automatic segment space management)
段中的block的位圖只有這幾種: 0~25%, 25%~50%, 50%~75%,75%~100%。 沒有單獨標記100% free的位圖。
index 塊split時,要去search 75%~100%的塊, 找到后, 然后判斷是否full free block(只有100% free的空塊才能被用來做索引的分裂)。
l索引分裂的時候(無論是50-50,還是90-10),split進程找臨近空塊,在找到臨近的70%-100%的空塊之后,卻發現不能重用的原因有2個:????
1,可能這個塊不是100%free的,而是70% ~ <100% free的, 也就是找到的這個block上面還有幾行或者多行索引記錄,所以不能被重用來做split
2,可能這個塊上還有一些其它的active transaction,所以它重用不了。
而每次尋找空塊然后failed ,oracle就會增加這個統計指標: failed probes on index block reclamation
l對某些庫的index contention的時候伴隨出現的buffer gets增加的問題原因解釋:
---update * set * where (select * 。。。) ,有子查詢的這種dml, 會受兩方面的影響導致該類dml的buffer gets增加:
1,可能select子查詢受一致性讀的影響,讀cr block產生更多的buffer gets
2,可能索引找空塊, 隨著索引碎片的增加,它找空塊的次數也變多(找空塊本身也是一個事務,有可能成功也有可能會失敗回滾),從而產生更多的buffer gets。
---insert ** values (。。。) , 這種無子查詢的dml , 會受這個因素影響導致dml 的buffer gets增加:
2,可能索引找空塊, 隨著索引碎片的增加,它找空塊的次數也變多(找空塊本身也是一個事務,有可能成功也有可能會失敗回滾),從而產生更多的buffer gets。
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/22818880/viewspace-2077100/,如需轉載,請注明出處,否則將追究法律責任。
總結
以上是生活随笔為你收集整理的oracle index contention,Index Contention等待的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle索引中丢失in或out参数,
- 下一篇: 用php编写一个强迫身份认证,php创建