目前,面对磁盘空间的严重不足,大量垃圾数据的存在。导致空间的大量浪费,怎样能更好的管理数据库,管理数据资产问题,已变的十分紧迫。
先通过将索引设置为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状态,相当于重建索引操作,对于热表会产生锁表现象。
因此,大家要根据自己的实际情况去选择合适的方法操作。