最近老是遇到现场表空间不足,又不肯增加表空间的需求,
无奈只能删历史表数据了,
背景:要释放的表数据和索引不在同一个表空间。
总结了一下释放表的方法:
1、truncate(我采用的是该方法)
delete删除历史数据,
建备份表把删除后的表数据插入(备份表建在其他表空间上),
把原先truncate掉,再将备份表数据插入。
2、
alter table t_userlog enable row movement;(也可以先move到其他表空间上)
alter table t_userlog shrink space cascade;
这样操作后索引会失效,需要重建索引
脚本如下:
declare
tmp_val varchar2(200);
begin
for rec in (select index_name from user_indexes)
loop
tmp_val:='alter index '||rec.index_name ||' rebuild';
begin
execute immediate tmp_val;
dbms_output.put_line (tmp_val);
exception
when others
then
dbms_output.put_line ('error: ' || tmp_val || '!');
end;
end loop;
end;
两种都需要其他空闲的表空间。
其他都不是很有效的。
使用alter table ... deallocate unused 命令回收表的空间(对HWM之上的没有作用)
例如: alter table AA.TEST deallocate unused ;
使用 alter tablespace TABLESPACENAME coalesce 命令回收表空间的空间。(对HWM之上的没有作用)
3、对应truncate和drop只是把块儿标记为未使用,在resize数据文件时不会释放的。除非真正未使用的块儿。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21811222/viewspace-705721/ ,如需转载,请注明出处,否则将追究法律责任。