转自:https://blog.51cto.com/fengfeng688/1955137
move和shrink的共同点:
收缩段,消除部分行迁移,消除空间碎片,使数据更紧密
shrink用法:
语法:
alter table TABLE_NAME shrink space [compact|cascades]
shrink分为以下两个阶段:
1.数据重组(compact)
通过一系列的insert,delete操作,将数据尽量排列在段的前面。在这个过程中,需要在表上面加RX锁,即只在需要移动的行上加锁。由于涉及到ROWID的改变,因此需要启动行迁移,同时disable基于rowid的trigger,这一过程对表的影响比较小。
2.高水位(HWM)的调整
此过程需要在表上加X锁,会造成表上的所有DML语句阻塞,在业务比较繁忙的系统上可能会产生较大的影响
因此如果系统比较繁忙,可以先重组数据,再调整水位线
/*打开行迁移*/ alter table TABLE_NAME enable row movement; /*只整理碎片 不回收空间*/ alter table TABLE_NAME shrink space compact; /* 整理碎片并回收空间*/ alter table TABLE_NAME shrink space; /*整理碎片回收空间 并连同表的级联对象一起整理(比如索引)*/ alter table TABLE_NAME shrink space cascade; /*分区表的整理*/ alter table pt_table modify PARTITION P1 shrink space cascade;
shrink的优点:
可以在线执行
可以使用参数cascade同步收缩索引等
执行后不会导致索引失效
可以避免alter table move过程中对表空间的占用
move:
语法:
alter table table_name move tablespace new_tablespace; alter index index_name rebuild tablespace new_tablespace
move的优点:
可以修改表的初始storage参数,例如initial
使用move的注意事项:
表上面的索引需要重建,因为move后,rowid会发生变化,因此索引会失效
move表是会对表锁定,而且是exclusive lock
move时要保证新的表空间剩余量
move和shrink的区别
move后,表在表空间中的位置肯定会变,可能前移也可能后移,一般来说如果该表前面的表空间中有足够空间容纳该表,则前移,否则后移
hrink后,表在表空间中的位置肯定不变,也就是表的段头位置不会发生变化
Move会移动高水位,但不会释放申请的空间,是在高水位以下(below HWM)的操作
shrink space 同样会移动高水位,但也会释放申请的空间,是在高水位上下(below and above HWM)都有的操作
使用move时,会改变一些记录的ROWID,所以MOVE之后索引会变为无效,需要REBUILD
使用shrink space时,索引会自动维护。如果在业务繁忙时做压缩,可以先shrink space compact,来压缩数据而不移动HWM,等到不繁忙的时候再shrink space来移动HWM
shrink可以单独压缩索引,alter index xxx shrink space来压缩索引。另外、压缩表时指定Shrink space cascade会同时压缩索引
原文地址:https://www.cnblogs.com/monkey6/p/11172148.html