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/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值