Oracle_索引置为invisible和unusable状态是否占用空间

目前,面对磁盘空间的严重不足,大量垃圾数据的存在。导致空间的大量浪费,怎样能更好的管理数据库,管理数据资产问题,已变的十分紧迫。

先通过将索引设置为Invisible状态,验证是否可以腾出空间。

1、创建测试用表

      create table sdxj.xiaoxu_t1 as select * from dba_objects;

2、插入大量数据

     insert into sdxj.xiaoxu_t1 select * from dba_objects;
     commit;

      -------可以多执行几遍,测试执行了7次。

3、创建created字段索引

     create index sdxj.idx_created on sdxj.xiaoxu_t1 (created);

4、对表进行分析

     exec dbms_stats.gather_table_stats( 'sdxj', 'xiaoxu_t1', estimate_percent => 30, method_opt => 'for all columns size 1', cascade => true, degree => 16 );

5、查询表和索引大小

     select owner,segment_name,bytes/1024/1024 "大小M"  from dba_segments where segment_name in ('XIAOXU_T1','IDX_CREATED');

      

6、设置索引为invisible状态

      alter index sdxj.idx_created invisible;

     ---查询修改后的状态

     select  owner,index_name,status,visibility from dba_indexes where index_NAME IN ('IDX_CREATED');

      

7、查看修改后表和索引大小

      select owner,segment_name,bytes/1024/1024 "大小M"  from dba_segments where segment_name in ('XIAOXU_T1','IDX_CREATED');

         ----经查询和第5步数据大小一致,说明空间未减少。

8、设置索引为unusable状态

     alter index sdxj.idx_created unusable;

     ---查询修改后的状态

     

9、查询修改后的表和索引大小

     select owner,segment_name,bytes/1024/1024 "大小M"  from dba_segments where segment_name in ('XIAOXU_T1','IDX_CREATED');

       ----这是只看到表的大小,索引对应的大小无返回记录。可见索引所占用的空间被释放。

10、恢复索引状态

      ----恢复索引unusable状态

      alter index sdxj.idx_created rebuild online;

     ---查询大小

     

   ---恢复索引invisiable状态

   alter index sdxj.idx_created visible;


总结: invisiable 可以将索引设置为不可见,一般用于字段索引不合适,但执行计划还在采用时,unusable 可以将不用的索引先设置为改状态,一段时间后

可以进行删除操作。invisiable 转换为visiable状态比较脚本一条命令即可,而unusable 转换为online状态,相当于重建索引操作,对于热表会产生锁表现象。

因此,大家要根据自己的实际情况去选择合适的方法操作。

你可能感兴趣的:(oracle,索引)