【TUNE_ORACLE】索引定期重建的利与弊

索引必须定期重建吗?

先来看看一些大部分人认为需要定期重建的理由:

1. 索引碎片会越来越多,而且这些碎片会被重复利用

2. B树索引会随着时间越来越不平衡

3. 索引聚簇因子随着时间会变得不同步

4. 删除索引后的空间不会被继续利用

除了第一条正确,其他三条理由都不正确,因为绝大多数情况下,是不需要重建B树索引的,B树索引一般能够自动管理和自动平衡。下面来分析每条的实际情况及原因:

第一条:DML操作会导致索引块附近的可用空间形成碎片,但这些碎片会被重复使用,建议不要在有索引的列上进行频繁DML操作,以减少碎片

第二条:B树索引会自动平衡

第三条:聚簇因子只能通过重组表中数据来改变

第四条:和第一条一样,索引空间依然能被重复利用

 

什么时候需要考虑重建索引?

1. 索引深度最好不要超过3级,否则重建。但是如果索引超过了3级但是深度不再发生变化,就不需要重建

2. 查询INDEX_STATS的DEF_LF_ROWS与LF_ROWS的比值如果大于0.2(表示删除的索引条目占索引总条目的20%),或者BLKS_GETS_PER_ACCESS大于10,就需要重建索引

具体操作如下:

SQL> ANALZE INDEX XXX VALIDATE STRUCTURE;   --必须执行索引分析这一步,不然查不出结果

SQL> select HEIGHT, DEF_LF_ROWS/ LF_ROWS , BLKS_GETS_PER_ACCESS from INDEX_STATS;

注:“ANALZE INDEX XXX VALIDATE STRUCTURE”对于分析空间占用大的索引时会对业务产生巨大影响,因为在执行期间不允许DML操作,并且需要消耗额外时间(不会锁表)

 

可能产生的影响

重建索引会导致redo工作量进一步增加,导致真个DB性能产生一定影响。虽然重建索引会使得索引块更加集中,但是会随着DML操作的增多导致碎片增多,因此索引在每次DML后,为了达到索引平衡,会重新分割索引来调整索引结构,需要占用I/O和CPU资源,并且经过一段时间后,该索引会继续被标记成“REBUILD”,需要继续重建。所以,强烈建议使用索引默认的自平衡机制,而不是定期重建索引。

一般使用索引合并来取代索引重建,理由如下:

1. 占用空间小

2. 只会合并索引块,而不是去重建索引导致索引结构改变

 

总结

强烈不建议定期重建索引,并且不建议对含有索引的列进行频繁DML操作!!


请使用浏览器的分享功能分享到微信等