关于 move 和 shrink 的一些总结

测试结论:

一、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’);

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值