第一种方法:alter table table_name shrink space
弊端:会导致行rowid改变
优点:能够释放delete删除的空间
select * from user_segments t where t.segment_name=upper('thd_stkstockindtl');
alter table thd_stkstockindtl enable row movement;
alter table thd_stkstockindtl shrink space;
select * from user_segments t where t.segment_name=upper('thd_stkstockindtl');
会减少byte和block数量
1、数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。
2、HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。Shrink Space语句两个阶段都执行。Shrink Space compact只执行第一个阶段。
如果系统业务比较繁忙,可以先执行Shrink Space compact重组数据,然后在业务不忙的时候再执行Shrink Space降低HWM释放空闲数据块。shrink必须开启行迁移功能。
alter table table_name enable row movement ;
注意:alter table XXX enable row movement语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。
语法:
alter table <table_name> shrink space [ <null> | compact | cascade ]; alter table <table_name> shrink space compcat;收缩表,相当于把块中数据打结实了,但会保持high water mark;
alter table <tablespace_name> Shrink Space;
收缩表,降低 high water mark;
alter table <tablespace_name> Shrink Space cascade;
收缩表,降低 high water mark,并且相关索引也要收缩一下下。
alter index idxname Shrink Space;
alter table xxx shrink space 高水位上下合并碎片,降低高水位 改变rowid
alter table xxx shrink space compact 高水位下合并碎片,不移动高水位 改变rowid
alter table xxx shrink space cascade 高水位上下合并碎片,降低高水位,相关索引也要收缩一下下 改变rowid
第二种:
复制表:create table t as select * from dest_tableName ;
删除表:drop tabledest_tableName purge ;
重新命名:alter table t rename to dest_tableName;
第三种:
exp导出表和该表数据,然后删除表,再imp倒入数据
第四种:
删除数据:truncate table table_name;
第五种:
alter index SYS_C0073003 rebuild online nologging; 对索引进行处理;
第六种:
alter table xxx move 高水位以下合并碎片,不移动高水位
alter table xxx move compress 高水位以下合并碎片,不移动高水位, 同时压缩表
alter table xxx shrink space