数据迁移过程中 delete 不释放表空间问题解决

      在一个应用中如果数据量比较大,开始影响到页面 sql 执行效率的时候,我们通常会考虑到将历史数据搬迁到一个历史库中,以此来提高当前系统的性能,但往往有时候可以发现搬迁了以后效率并没有提升或者反而有一定的下降。

 

      其中一个主要的原因就是我们在操作的时候通常都是用 delete 语句来删除一些历史数据,但 delete 语句是不会释放表空间占用的数据块,也就是说数据是删掉了,但位置还保留着,这块空着的表空间只能由以后再 insert 进来的时候填充。很显然这不是我们想要的效果,我们想要的就是减少表空间,提高 sql 的执行效率。

 

      下面说下解决的办法,思路就是用 alter table XX move tablespace XX; 语句将表先移到一个空闲的表空间上再移回来,网上也有人通过查 user_tables 里面的 block 字段来观察 move 表空间前后的占用的块,那个里面只是一个统计的结果,不能作为实际考量,因为在 move tablespace 的时候所有字段的 rowid 都是重新创建的,没有数据的那些块自然也就丢掉了,再 move 回来。可以理解成类似于在其他表空间创建一个临时表,把当前的表删掉重新建回来。

 

      还有一点要注意的就是,move 的同时既然 rowid 是重新创建的,那么该表上的索引自然也就失效了,再 move 回来以后别忘了把索引重新再建一下,要不然 sql 会报错无法执行。

      最后别忘了分析下表。analyze table XX compute statistics;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值