关于 move 和 shrink 的一些总结

本文详细探讨了Oracle数据库中Move和Shrink操作的特性与影响。Move操作需要额外表空间,影响DML操作,需重建索引,能消除行迁移,改变表的数据段位置。Shrink操作不需额外空间,分为数据重组和降低HWM两步,维护索引但不整理碎片,不完全消除行迁移,不影响段头块位置。Move和Shrink都会导致ROWID变化,影响索引,特别是Move会使索引变为UNUSABLE,需在线重建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试结论:

一、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

  1. shrink过程中并没有用到额外的表空间。
  2. shrink操作其实可以分为两步:
    第一步:对数据进行重组,即只会整理碎片,不会降低高水位,也就是说不会释放空间。
    通过一系列的delete/insert组合来完成,具体的语法是 alter table t1 shrink space compact。该过程会在表上加共享锁,在移动的行中加排它锁。并且会维护索引。
    第二步:降低HWM,回收空间,与move不同的是,shrink可以回收HWM以上的块。该过程会在表上加排它锁,因此业务繁忙时并不适合执行该降低HWM的操作。
  3. shrink操作会维护索引,但是不会对索引进行碎片整理。如果加入cascade选项,那么维护索引的同时会对索引进行碎片整理。
  4. shrink操作的一些相关测试数据:以2000000数据(233M)为例,删除800000条数据,分两步执行shrink操作。
    数据重组大概用时1分钟58秒,共产生了895M的redo,353M的undo。回收HWM阶段仅用1秒,产生了4K的redo,1K的undo。表由233M缩小至226M。
  5. shrink操作不能完全消除行迁移。
  6. 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’);
insert into t values(5,’a5’);
insert into t values(6,’a6’);
insert into t values(7,’a7’);
insert into t values(8,’a8’);
insert into t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值