如果经常在表上执行DML操作,会造成数据库块中数据分布稀疏,浪费大量空间。同时也会影响全表扫描的性能,因为全表扫描需要访问更多的数据块。从oracle10g开始,表可以通过shrink来重组数据使数据分布更紧密,同时降低HWM释放空闲数据块。

从10g开始,oracle开始提供Shrink的命令,假如我们的表空间中支持自动段空间管理 (ASSM),就可以使用这个特性缩小段,即降低HWM。这里需要强调一点,10g的这个新特性,仅对ASSM表空间有效,否则会报 ORA-10635: Invalid segment or tablespace type。

比如我工作中使用的系统有个LOG表,记录的日志经常会删除。时间长了查询速度变慢,而且浪费表空间。下面就以这个表为例,记录下收缩表空间的方法。

1. 查看收缩前表的使用情况

select sum(bytes)/1024/1024 Mb from user_segments where segment_name='LOG';

2. 开启行迁移

alter table LOG enable row movement;

3. 整理表空间内的碎片

 alter  table LOG shrink space compact;

4. 收缩表空间

alter table LOG shrink space;

5.再查看收缩后的表空间使用情况

select sum(bytes)/1024/1024 Mb from user_segments where segment_name='LOG';

注意:收缩表空间要在数据库比较空闲的时候做。