shrink space分两个阶段:
1)通过把segment后面的数据delete,然后insert到segment的前面,来把表里的块变得更加紧凑。这个操作的事务单位比较小,操作过程中,会在表上加模式为3的表锁,这种锁的等级跟DML事务在表上加的锁等级一样,一般比较安全,不会阻塞这个表上的DML操作。在这个过程中即使把当前会话取消掉,也不会有风险。下次可以继续上一次的操作。而不是很多人理解的,取消掉后,会回滚之前的所有的delete+insert 操作。由于这个阶段的事务单位比较小,因此取消(比如ctl+c)后,只会回滚此次没有提交掉的事务。如果你的表比较大,那么可以分多次来做这个操作,每次可以放心的把它cancel掉,下次继续。第一个阶段对应的命令为:
alter table table_name shrink space compcat;
从上图看到在执行操作一过程中,ORACLE启动了一个小事务,这个小事务的ID1,ID2在不断的变化。
2)第二步就是降低高水位,这个过程要在表上加X锁,会造成所有这个表上的DML阻塞。我们可以在做这个操作前,多执行几次阶段一的操作。这样能保证这个时间足够的小。但是无论如何,我测试这个操作的时候,如果表比较大,比如5G,即使执行了多次的操作1,阶段二依然会比较漫长,用10046跟踪,会发现,这个阶段,ORACLE以单块读的形式