降低高水位线有多种方法,这里列出较常用的几种:
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种较自动但有很多限制而且整个过程不能控制都由实例自动完成