一次在ocp书中看到shrink的说明,但说的不太清楚,故讨论下。本人做了些测试,给大家分享下:
 用shrink有两个前提条件:
1、表必须启用row movement,如:
alter table shenlu enable row movement; 这是必要条件,因为行要重组,rowid会变化。
alter table shenlu shrink space;  #开始收缩表。
2、注意表段所在表空间的段空间管理(segment space management)必须为auto 
因表shenlu用的表空间是d_para.检查如下
select dbms_metadata.get_ddl('TABLESPACE','D_PARA') FROM DUAL ;
发现是SEGMENT SPACE MANAGEMENT AUTO 符合要求。

segment shrink分为两个阶段:
  SHRINK SPACE有两种选项:   COMPACT 和 CASCADE
  COMPACT是基于行的Shrink, 减少segment的碎片,使列变得更紧凑,但不会改变高水位线, 不会锁表。
   后者会修改HWM, 会对segment产生锁,但时间比较短。做好不要放在忙时操作。
1、数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。
2、HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。
注意:shrink space语句两个阶段都执行。
shrink space compact只执行第一个阶段。
如果系统业务比较繁忙,可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块。

举例如下:
ALTER TABLE  shenlu ENABLE ROW MOVEMENT  ;
ALTER TABLE  shenlu SHRINK SPACE ;
ANALYZE TABLE shenlu  COMPUTE  STATISTICS ;
select * from dba_tables where table_name='SHENLU'
ALTER  TABLE shenlu DISABLE  ROW movement;
                                                                                                    沈鲁
                                                                                              2015-6-10