降低高水位线有多种方法,这里列出较常用的几种:

 

1、expdp/impdp
先将表导出,这时对数据行进行了整理去除了空闲空间,高水位线也到了新的位置
再将导出的表导入

 

2、手动临时表
就是网络上说的CTAS方法create table ... as select ...

 

创建临时表保存数据
  create table temptable as select * from table_name;

 

临时表完成后又有两个办法继续

a、
彻底删除原表
  drop table table_name pruge;
重名名临时表为原表名
  alter table temptable rename to table_name;

b、
清空主表
  truncate table table_name;
重新导回数据
  insert into table_name select * from temptable;
丢掉临时表
  drop table temptable;

 

3、使用move

  alter table move tab_name;  在当前表空间中move
  alter table move tab_name tablespace tbs_name;  将其move到其他表空间
  move会锁表应该避免在业务高峰期操作
  还会影响index,完成后需要重建索引
  重建索引的命令ALTER INDEX INDEX_NAME REBUILD; INDEX_NAME是原表的索引名,需要自己查找
  move过程中需要考虑空间问题,因为过程中它相当于在表空间中又建了一个一样大小的表

 

4、shrink收缩
  为Oracle 10g新增功能
  alter table tab_name enable row movement;
  alter table tab_name shrink space;
  这个命令不需要额外的空间分配,只在原表内部进行,所以首先要使行row可以移动movement,就是需要先使行可迁移。
  只能用在自动段空间管理的段,完成后不需要再重构索引

 

5、truncate
  采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。

 

在表中有数据要保留的情况下不能使用truncate,
其它方法都是对表进行重新的整理,和系统的磁盘碎片整理相似
第1、2种方法为手动操作,步骤较多,但操作起来比较安定
第3、4种较自动但有很多限制而且整个过程不能控制都由实例自动完成