深入理解重建索引

引自原帖:https://czmmiao.iteye.com/blog/1481957

索引能带来性能提升,但同时有额外的开销。维护索引包括索引重建。

维护索引的优势:

  >SQL优化器CBO对于索引的使用会产生较小的成本值,故建议使用索引。

  >使用索引扫描的查询扫描的物理索引块会减少,效率会提升。

  >需要缓存的索引块减少了,让出了内存供其他组件使用

重建索引的原因:

  >删除的空间没有重用,导致索引出现碎片

  >删除大量数据后,空间没有重用,导致索引虚高

  >索引的clustering_facto和表不一致

索引出现碎片:

  索引只有删除和插入操作,如果索引中的记录关键字需要更新,就需要将旧记录的位置标记为删除,并在相应的叶子节点插入新的索引纪录。这种删除标记并非真正的删除索引块中的记录,索引块中被标记为删除的记录只有在相同索引条目插入到相同块的相同位置时才能重用。由于即使相同的索引记录也不一定插入到被删除的空间中,故如果对索引频繁进行update和delete操作很容易导致索引出现碎片。较高的PCTFREE也容易出现索引碎片。索引的碎片也就导致了,访问索引数据时需要访问更多的索引块。

索引虚高:

  频繁的update和delete索引导致索引块中有碎片,如果进行大量的delete操作把整个索引块的数据都删了呢?索引中的索引条目仍然只被标记为删除而没有被真正清空。如果这时候的索引关键字是一个不断增大的id,那么被标记为删除的索引条目就永远不会被重用,那树就不会不断增长,也就出现了,表的数据空间减少了,而索引的数据空间却在不断增大的情况。由于索引的高度不断增加,访问索引数据时需要访问更多的索引块。

clustering_factor(聚簇因子|聚簇因子是 Oracle 统计信息中在CBO优化器模式下用于计算cost的参数之一,决定了当前的SQL语句是否走索引,还是全表扫描以及是否作为嵌套连接外部表等。)对 B树索引 的影响:

  对于clustering_factor来说,它是用来比较索引的顺序程度与表的杂乱排序程度的一个度量。Oracle在计算某个clustering_factor时,会对每个索引键值查找对应到表的数据,在查找的过程中,会跟踪从一个表的数据块跳转到另外一个数据块的次数(当然,它不可能真的这么做,源代码里只是简单的扫描索引,从而获得ROWID,然后从这些ROWID获得表的数据块的地址)。每一次跳转时,有个计数器就会增加,最终该计数器的值就是clustering_factor。

猜你喜欢

转载自www.cnblogs.com/HongMoK/p/10376320.html