`
liulanghan110
  • 浏览: 1064291 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

重建索引

阅读更多
    关于索引重建,只需要记住一条: 如果它没坏,就不要去重建它。
 
    关于重建索引有用与否的讨论有很多。一般而言,极少需要重建 B 树索引,基本原因是 B 树索引很大程度
上可以自我管理或自我平衡。事实上,大多数索引都能保持平衡和完整,因为空闲的叶条目可以重复使用。
更新和删除操作确实会导致索引块周围的可用空间形成碎片,但是一般来说这些碎片都会被正确的重用。
 
 

 

    B+树索引对于删除的管理

 

    当删除表里的一条记录时,其对应于索引里的索引条目并不会被物理的删除,只是做了一个删除标记。

 

一个新的索引条目进入一个索引叶子节点的时候,oracle会检查该叶子节点里是否存在被标记为删除的索引

 

条目,如果存在,则会将所有具有删除标记的索引条目从该叶子节点里物理的删除。当一个新的索引条目进

 

入索引时,oracle会将当前所有被清空的叶子节点(该叶子节点中所有的索引条都被设置为删除标记)收

 

回,从而再次成为可用索引块。

 

     尽管被删除的索引条目所占用的空间大部分情况下都能够被重用,但仍然存在一些情况可能导致索引空间

 

浪费,并造成索引数据块很多但是索引条目很少的后果,这时该索引可以认为出现碎片。而导致索引出现

 

片的情况主要包括:

 

    1)不合理的、较高的PCTFREE。很明显,这将导致索引块的可用空间减少。

 

    2)经常被删除或更新的键值,以后几乎不再会被插入时。前面我们知道,某个索引块中删除了部分的索

 

引条目,只有当有键值进入该索引块时才能将空间收回。如果一个键值被删除或更新(更新是先删除旧值在

 

插入新值)后,该键值所在的数据块不在有新值插入

 

进来,就会导致碎片。

 

      如何判断索引出现碎片

 

      直接运行ANALYZE INDEX … VALIDATE STRUCTURE命令,然后检查index_stats视图的pct_used字段,如果该字段过低(该值没有标

 

准,参考值为50%),则说明存在碎片。

 

        碎片的影响

    

        碎片对条件值为等于的情况(包括In,or等)几乎没有影响,但对利用索引列的范围扫描(索引范围扫

 

描)有一定的影响,因为需要访问一些被标记为删除的无用的数据。

 

       去除碎片

 

       从上面的描述也可以知道,更新和删除操作确实会导致索引块周围的可用空间形成碎片,但是一般来说

 

这些碎片都会被正确的重用。所以一般来说不需要重建索引。定时重建索引更不可取。但是当确实出现了很

 

多碎片时该怎么去除碎片呢?这里有两种方法

 

合并索引:合并索引不改变索引的物理组织结构,只是简单地将B树叶子节点中的存储碎片合并在一起。

重建索引:重新创建一个新的索引,删除原来的索引。

合并索引并没有大幅地更改索引的物理结构,只是简单地将B树中的叶子节点中的碎片合在一起,因而并不会对叶子节点的存储参数和表空间进行更改,合并执行前与合并执行后的B树节点如图所示。




 
 

由图中可以看到,合并前放在两个节点中的碎片被合并到了1个节点,而另一个叶子节点就被释放了,这

 

个释放后的叶子节点就可以被再次利用,使得检索的次数变少,提高了查询的效率。

 

语法:ALTER INDEX idx_ename_empno COALESCE;

 

重建索引实际上就是对原有的索引的删除,再重新建一个新的索引。因为是对现有的索引进行删除和重

 

新创建,因此在使用ALTER INDEX时,可以使用各种存储参数来重新设定索引,比如使用STORAGE指

 

定存储参数,使用TABLE SPACE指定表空间或者是利用NOLOGGING选项避免产生重做日志信息。

 

语法:ALTER INDEX 索引名称 REBUILD

 

另外要注意的是,在线重建索引是高风险的操作。在线重建索引是基于日志表。当开始在线重建索引

 

时,系统会创建一个临时日志表,用于存放索引重建期间产生的日志信息。同时这个索引的FLAG字段上

 

会被设置REBUILD标识。当索引信息更变时,会把更变信息写入日志表。当在线重建失败时,这个日志

 

表和数据字典中的状态位都需要靠SMON来清理。要清理这个日志表,需要先锁定这张表。如果业务繁

 

忙,该表的数据一直在变化,SMON就无法对其进行锁定,因此就不能及时清理。如果该表更变十分平

 

凡,或许这项清理工作会在几天甚至几星期后才能完成。

 

所以建议在在线重建索引时,必须注意:

 

1.所有操作写成脚本在后台以nohup运行

 

2.对于高可用性系统,不要在无人值守的情况下进行此操作。

 

3.准备应急预案,一旦出现问题,马上采取措施。

 

 

重建索引和合并索引都可以消除索引碎片,但两者在使用上有明显的区别:

 合并索引不能将索引移动到其他表空间,但重建索引可以。

 合并索引代价较低,无须额外存储空间,但重建索引恰恰相反。

 合并索引只能在B树的同一子树中合并,不改变树的高度;但重建索引重建整个B树,可能会降低树的高度。

 

总结:1.对于索引来说, 如果它没坏,就不要去重建它。

 

           2.不要定期重建索引,可以定期检查索引,在判断索引确实出现问题后再去重建。

 

           3.在可以定期的合并索引。

            

 
  • 大小: 14.5 KB
  • 大小: 8.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics