oralce move和shrink释放高水位

转自: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