测试结论:
一、move
1. move过程中需要额外的表空间,需要的大小大约等于当前表中数据量的大小,move结束后立即释放该额外空间。
2. move过程中对表加排它锁,会影响其他session的DML操作。
3. move操作并不会维护索引,因此move完毕后需要对索引rebuild。
4. move操作会降低HWM,但是并不会释放HWM以上的空块,也就是说,move只会对HWM以下的块进行操作。
5. move操作的一些相关测试数据:以2000000数据(233M)为例,删除800000条数据,执行move操作。
大概用时4秒,共产生了319K的redo,56K的undo。表由233M缩小至145M。
6. move操作可以完全消除行迁移。
7. move操作后,为表分配的数据段位置发生了改变,即段头块的位置发生了改变。
二、shrink
- shrink过程中并没有用到额外的表空间。
- shrink操作其实可以分为两步:
第一步:对数据进行重组,即只会整理碎片,不会降低高水位,也就是说不会释放空间。
通过一系列的delete/insert组合来完成,具体的语法是 alter table t1 shrink space compact。该过程会在表上加共享锁,在移动的行中加排它锁。并且会维护索引。
第二步:降低HWM,回收空间,与move不同的是,shrink可以回收HWM以上的块。该过程会在表上加排它锁,因此业务繁忙时并不适合执行该降低HWM的操作。 - shrink操作会维护索引,但是不会对索引进行碎片整理。如果加入cascade选项,那么维护索引的同时会对索引进行碎片整理。
- shrink操作的一些相关测试数据:以2000000数据(233M)为例,删除800000条数据,分两步执行shrink操作。
数据重组大概用时1分钟58秒,共产生了895M的redo,353M的undo。回收HWM阶段仅用1秒,产生了4K的redo,1K的undo。表由233M缩小至226M。 - shrink操作不能完全消除行迁移。
- shrink操作后,为表分配的数据段位置并没有发生变化,即段头块的位置没有改变。
(1) oracle 的move 操作,rowid 如何变化?
创建一张测试表,插入十条数据
create table t (id int,name varchar2(20));
insert into t values(1,’a1’);
insert into t values(2,’a2’);
insert into t values(3,’a3’);
insert into t values(4,’a4’);