重建b-tree索引

 

前言:

       随着我们的系统数据量越来越大,使用时间越来越长,有时需要考虑重建索引以提高系统的性能。通过本文简单描述下如何快速重建索引,希望同以后大家做维护有所帮助。

一、             重建索引的条件

       首先,我们要知道那些情况下,可能需要考虑重建索引,一般有如下两种情况:

1.         如果表上频繁发生update,delete操作,可能需要考虑重建索引

2.         对表进行了move操作,必须重建表上的所有索引,因为move操作会导致rowid变化,不重建索引,索引查询会有问题。

二、             判断重建索引的标准

      以上列出的两种情况,除了第二种必须重建索引以外,前一种是否需要重建索引,要视具体情况而定,那么什么情况下,才必须重建索引呢?这里我们有个判断标准,就是看索引是否倾斜的严重,是否浪费了空间;

  那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间,我们可以通过如下语句进行检查:

1.         对索引进行结构分析

Analyze index indexname validate structure;

2.         在执行步骤1session中查询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)       创建索引时,执行计划不同

Rebuildindex fast full scan 方式读取原索引中的数据来构建一个新的索引。

Rebuild online 执行全表扫描获取数据。

rebuild方式创建索引:

rebuild online方式创建索引:

(2)       rebuild 会阻塞dml操作,rebuild online 不会阻塞dml操作,这点也是我们推荐使用rebuild online方式重建索引的重要原因

(3)       rebuild online时系统会产生一个SYS_JOURNAL_xxxIOT类型的系统临时日志表,所有rebuild online时索引的变化都记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了,也就是说在rebuild online过程中,原来的旧索引还可以使用,直到重建完成。

       通过上面的比较,综合考虑,我建议大家在重建索引的时候,都使用rebuild online 方式重建。

       另外我们在重建索引的时候要注意以下几点:

1.       需要检查表空间是否足够。

2.       虽然rebuild online操作允许dml操作,但是还是建议不要在业务部繁忙时间段进行。

3.       重建索引会产生大量redo log

后记:

     通过前面的介绍,我们应该了解重建索引的一些基本知识,希望对以后各位在从事优化工作起到一点点帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值