【正确答案】一般而言,极少需要重建B树索引,基本原因是B树索引很大程度上可以自我管理或自我平衡。认为需要重建索引的最常见理由有:
1)B-Tree索引随着时间的推移变得不平衡(错误的认识)。
2)索引碎片在不断增加,但是这些碎片会被重用。
3)索引不断增加,删除的空间没有重复使用(错误的认识)。
4)索引聚簇因子(Clustering Factor)不同步,可以通过重建修复(错误的认识)。
事实上,由于空闲的索引叶条目可以重复使用,所以大多数索引都能保持平衡和完整,插入、更新和删除操作确实会导致索引块周围的可用空间形成碎片,但是一般来说这些碎片都会被正确的重用。聚簇因子可以反映给定的索引键值所对应的表中的数据排序情况。重建索引不会对聚簇因子产生影响,要改变聚簇因子只能通过重组表的数据。
若是重建索引,则建议对以下的索引进行重建:
1)在分析(ANALYZE)指定索引之后,查询INDEX_STATS的HEIGHT字段的值,如果HEIGHT>=4即索引深度超过3级,那么最好重建(REBUILD)这个索引,但是如果这个值一直保持不变,那么这个索引也就不需要重建。
2)在分析(ANALYZE)指定索引之后,查询INDEX_STATS的DEL_LF_ROWS和LF_ROWS的值,如果(DEL_LF_ROWS/LF_ROWS)*100>=20即已删除的索引条目至少占有现有索引条目总数的20%,那么表示这个索引也需要重建。
重建索引的影响非常明显,主要有以下几点:
1)大多数脚本都依赖INDEX_STATS动态表,此表使用以下命令填充:
