教学文章
Technology Exchange
热门课程
400电话

免费咨询热线
400-090-9964

教学文章

一亿行删除或修改一千万行的思路总结

时间:2017-07-13 来源:

  要在一个1亿行的大表中,删除1千万行数据

  在对数据库其他应用影响最小的情况下,以最快的速度完成

  那么操作期间应该注意什么?如果中途中断了,有木有方法再继续?

  如果应用不可停,又该怎么办呢?

  删除了10分之一的数据,索引可能还需重建,统计信息可能也得更新

  由于昂贵的delete操作,Undo空间亚历山大、Redo log 也要担心被撑爆

  而且批量delete虽然影响最小,但是可能会造成大量的空数据块

  如此种种,剪不断、理还乱、是删除,别是一番滋味在心头啊

  很显然,删除或更新的方法和数据库的设计及软硬件的配置有重大关系

  不同的数据库设计,采用的方案必然不同,其所谓的因库制宜

  在操作之前,最简单也是最重要的事情,那就是作个有效的备份

  无论什么情况下,只要对数据库做变更,都不别忘了有效的备份

  如果条件允许,操作前最好做个有效的全备

  如果不允许,你最起码要备份你要操作的对象和数据

  如果不备份,那便是在钢丝上耍,而且下面就是万丈深渊

  思路一:

  分区表方案的情况讨论

  这种想法是最基本的,也是后面几种思路的底韵

  最差的一种方法大概就是:

  delete from xxx where xxx=xxx

  下班前提交这样一个语句,估计晚上觉都睡不踏实,满脑子都是脚本运行的情况以及可能出现的错误

  如果是分区表,要删掉的数据正好在分区之内,那就最简单了,直接truncate partition,省心省力

  对于1亿的数据量,传统的bulk delete,forall ,for loop等等,效果都不太可观,可分而治之

  可行的方案是:

  1.做分区表,逐个分区处理

  如果表未分区又有足够的磁盘空间,可用在线重定义的方法,把表转成分区表

  然而如果业务不可停,在线重定义严重影响数据库正常使用的,最好是晚上干活

  2.接着按照表里面的条件,大概100000条记录一个循环,处理完立即提交

  3.如果磁盘很大,可以用磁盘换性能,直接用insert替代delete,把满足条件的行记录,插入到新表

  insert的时候还是要用循环,分十万~百万条记录左右,提交一次

  (以上内容摘于网络,如有侵权,请告之,将第一时间删除)

版权所有@北京神脑资讯技术有限公司(CUUG,中国UNIX用户协会) Copyright ALL Rights Reserved 京ICP备11008061号-1

CUUG旗下网站:www.cuug.com.cn www.cuug.com oracle.cuug.com bbs.cuug.com www.cuug.net

电话:010-59426307 010-59426319 邮政编码:100089

地址:北京市海淀区北清路164号28-38号院