要消除数据块级别的碎片,Oracle 10g之前通过Move或者Exp/Imp方式来进行,但不管使用哪种方式,都会中断应用。因为在Move的过程中会锁定表,并且Move结束后所有的索引会失效。而Exp/Imp的过程中,表也是不可用的。
Oracle 10g以后,引入了收缩(shrink)操作来消除数据块的碎片。
收缩操作是通过事务的方式来将数据行从一个数据块转移到另一个数据块里。在收缩过程中,表仍然可以进行DML操作。
尽管收缩操作是事务,但是并没有引起数据的变化,因此不会引起触发器的触发。
进行收缩操作的二个前提条件:
表所在的表空间必须使用ASSM;
在被收缩的表上必须启用Row Movement选项。
alter table TableName enable row movement;
收缩操作分为二个阶段:压缩和降低HWM。
alter table TableName shrink space [compact] [cascade] ;
虽然在10g中可以用shrink ,但也有些限制:
1). 对cluster,cluster table,或具有Long,lob类型列的对象 不起作用。
2). 不支持具有function-based indexes 或 bitmap join indexes的表
3). 不支持mapping 表或index-organized表。
4). 不支持compressed 表
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/81227/viewspace-691547/
,如需转载,请注明出处,否则将追究法律责任。