在决定是否需要重建Oracle索引时,主要考虑的原因是查询性能变差。在讨论中,通常有很多关于索引重建是否有用的讨论。一般来说,重建B-tree索引的需求非常罕见,因为B-tree索引在很大程度上是自我管理或自我平衡的。
常见的索引重建理由包括:
索引变得碎片化
索引不断增长,已删除的空间未被重新利用
索引的聚簇因子大于索引块数
事实上,大多数索引保持平衡且无碎片,因为空闲的叶子节点会被重新利用。插入/更新和删除操作会导致空闲槽分散在索引块周围,但这些通常会被重新填充。聚簇因子反映了表数据相对于给定索引键的排序情况。重建索引不会影响聚簇因子,反而需要进行表的重组。
许多脚本依赖于index_stats
动态表,该表通过以下命令填充数据:
analyze index index_owner.index_name validate structure;
虽然这是一种检查索引的有效方法,但在分析索引时会获取独占表锁。对于大索引来说,这可能会非常严重,因为在此期间不允许对表进行DML操作。虽然可以在线运行而不考虑锁定问题,但可能会消耗更多时间。
「重建索引的步骤」
查找高度(blevel+1) > 4 的索引(即BLEVEL > 3):
SQL> select owner, index_name, table_name, blevel from dba_indexes where BLEVEL>3;
SQL> analyze index idx_test validate structure;
通过分析索引,查找(DEL_LF_ROWS/LF_ROWS*100) > 20 的比率:
SQL> SELECT name, height, lf_rows, del_lf_rows, (del_lf_rows/lf_rows)*100 as ratio FROM INDEX_STATS;
现在可以重建索引:
SQL> alter index idx_test rebuild;
「欢迎关注我们的公众号,获取更多技术分享与经验交流。」
文章转载自数据库驾驶舱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




