暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle什么时候需要重建索引

数据库驾驶舱 2024-08-15
187

在决定是否需要重建Oracle索引时,主要考虑的原因是查询性能变差。在讨论中,通常有很多关于索引重建是否有用的讨论。一般来说,重建B-tree索引的需求非常罕见,因为B-tree索引在很大程度上是自我管理或自我平衡的。

常见的索引重建理由包括:

  • 索引变得碎片化

  • 索引不断增长,已删除的空间未被重新利用

  • 索引的聚簇因子大于索引块数

事实上,大多数索引保持平衡且无碎片,因为空闲的叶子节点会被重新利用。插入/更新和删除操作会导致空闲槽分散在索引块周围,但这些通常会被重新填充。聚簇因子反映了表数据相对于给定索引键的排序情况。重建索引不会影响聚簇因子,反而需要进行表的重组。

许多脚本依赖于index_stats
动态表,该表通过以下命令填充数据:

analyze index index_owner.index_name validate structure;

虽然这是一种检查索引的有效方法,但在分析索引时会获取独占表锁。对于大索引来说,这可能会非常严重,因为在此期间不允许对表进行DML操作。虽然可以在线运行而不考虑锁定问题,但可能会消耗更多时间。

「重建索引的步骤」

  1. 查找高度(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; 

  1. 通过分析索引,查找(DEL_LF_ROWS/LF_ROWS*100) > 20 的比率:

SQLSELECT name, height, lf_rows, del_lf_rows, (del_lf_rows/lf_rows)*100 as ratio FROM INDEX_STATS;

  1. 现在可以重建索引:

SQL> alter index idx_test rebuild;

「欢迎关注我们的公众号,获取更多技术分享与经验交流。」


文章转载自数据库驾驶舱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论