oracle index contention,index contention等待 -凯发k8官方网
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/,如需转载,请注明出处,否则将追究法律责任。
总结
以上是凯发k8官方网为你收集整理的oracle index contention,index contention等待的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: oracle索引中丢失in或out参数,
- 下一篇: 用php编写一个强迫身份认证,php创建