前言:
随着我们的系统数据量越来越大,使用时间越来越长,有时需要考虑重建索引以提高系统的性能。通过本文简单描述下如何快速重建索引,希望同以后大家做维护有所帮助。
一、 重建索引的条件
首先,我们要知道那些情况下,可能需要考虑重建索引,一般有如下两种情况:
1. 如果表上频繁发生update,delete操作,可能需要考虑重建索引
2. 对表进行了move操作,必须重建表上的所有索引,因为move操作会导致rowid变化,不重建索引,索引查询会有问题。
二、 判断重建索引的标准
以上列出的两种情况,除了第二种必须重建索引以外,前一种是否需要重建索引,要视具体情况而定,那么什么情况下,才必须重建索引呢?这里我们有个判断标准,就是看索引是否倾斜的严重,是否浪费了空间;
那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间,我们可以通过如下语句进行检查:
1. 对索引进行结构分析
Analyze index indexname validate structure;
2. 在执行步骤1的session中查询index_stats表,不要到别的session去查询
select HEIGHT,DEL_LF_ROWS/LF_ROWS from index_stats;
3. 在步骤2查询出来的HEIGHT>=4或者DEL_LF_ROWS/LF_ROWS>0.2的场合,该索引考虑重建;
其中2个字段的含义分别是:HEIGHT B-Tree索引的高度 del_lf_rows:索引删除行数lf_rows:索引总行数
如下面的例子,是我对某用户的住院费用记录_UQ_NO索引进行分析:
根据上面的经验,该索引就应该考虑重建,以下是我重建后再次分析的结果:
三、 如何重建索引
通过对比,我们可以看到,重建索引的确对索引的状态有所改善,那么,我们通过什么方式来重建指定的索引呢?主要有2种方式
1. 删除原来的索引,然后再重新创建个新的索引;
2. 通过rebuild语句重建
以上两种方式都可以达到重建索引的目的,但是,删除重建,如果在大表上操作,会比较耗时,而且在创建索引的过程中,会对表中数据进行锁定,严重影响性能,我们一般不推荐这种操作,因此大多数情况下,我们建议采用rebuild方式重建索引。
四、 使用rebuild语句重建索引
在使用rebuild语句重建索引的时候,我们常常会用到关键字online,使用了它和不使用它有什么区别呢?我们来进行下分析。
(1) 创建索引时,执行计划不同
Rebuild以index fast full scan 方式读取原索引中的数据来构建一个新的索引。
Rebuild online 执行全表扫描获取数据。
rebuild方式创建索引:
rebuild online方式创建索引:
(2) rebuild 会阻塞dml操作,rebuild online 不会阻塞dml操作,这点也是我们推荐使用rebuild online方式重建索引的重要原因
(3) rebuild online时系统会产生一个SYS_JOURNAL_xxx的IOT类型的系统临时日志表,所有rebuild online时索引的变化都记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了,也就是说在rebuild online过程中,原来的旧索引还可以使用,直到重建完成。
通过上面的比较,综合考虑,我建议大家在重建索引的时候,都使用rebuild online 方式重建。
另外我们在重建索引的时候要注意以下几点:
1. 需要检查表空间是否足够。
2. 虽然rebuild online操作允许dml操作,但是还是建议不要在业务部繁忙时间段进行。
3. 重建索引会产生大量redo log。
后记:
通过前面的介绍,我们应该了解重建索引的一些基本知识,希望对以后各位在从事优化工作起到一点点帮助。