从以上可以看出两点内容,产生索引数据之后剩余的空间不会返还给数据库,但是当插入新数据的时候将有可能重新利用之前被删除数据的空间,另外一点可以看del_lf_row已经评估出现错误,到目前为止刚刚开始删除9999条数据,然后插入一条数据在进行分析,那么现在既然是9582,因此不能仅仅依靠del_lf_rows进行索引重建评估。以前记得有个朋友曾经提过这么一个问题,说是测试环境库执行一条sql会非常的块,但是导到正式环境却很慢,但是执行计划都是一样的,我的怀疑就是需要重建正式环境库的索引。因此,如果确定对 索引相同部分执行了大量删除操作,产生了大量的索引碎片,并且查询每次读取了大量的索引行,索引被频繁使用,这时候重建索引是有价值的。
第二种:合并索引
合并索引就是将索引段中相邻的索引块其中空闲空间进行整合重组,从而释放索引块空间,这比较类似于我们windows的磁盘碎片整理,但是注意该过程不会将腾出的空间返回与数据库,而是加入到空闲空间列表中,以便下次在进行使用。这种操作对于那种以序列或是时间日志为字段的表是有非常重要价值的,因为当我们对这些表删除了大部分数据,那么其中很多空间是无法在进行使用的,那么在我们制定谓词查询的时候通常会扫描索引中很多空快,那么合并索引就将空的索引块进行释放与索引块的空闲列表中。
语句非常简单:
alter index index_name coalesce;
合并索引与重建索引不同事,合并索引不会降低索引的高度,而是对其数据条目进行重组整合,但是重建可能会降低索引高度,另外重建索引需要2倍的磁盘空间,首先需要存储原先的索引条目数据,还需要额外的空间存储新调整 的索引数据直到重建完成才可。
注:合并索引是一种在线操作。
第三种:shrink 索引:
因为shrink是一个耗资源相对严重的过程,因此两个过程,一个是compact参数,另一个是直接shrink space,第一种类似于coalesce但是相比会产生更多的redo日志,执行完后不会释放空间,但是shrink space 除了整理碎片还可以将空间释放给表空间,但是shrink space虽然是在线可以做的,依然会产生过打的redo日志。除此之外shrink space还要启动行移动。
eg:
alter index index_name shrink space compact;
alter index index_name shrink space;
注:Shrink operations can be performed only on segments in locally managed tablespaces with automatic segment space management (ASSM).