几百万的数据如果没人用的前提下,插入临时表可能只需要4分钟左右,truncate接近实时,插回去可能只需要几分钟,整个过程可能不到15分钟,所有时间都是经验而已,没有理论支撑,仅供参考,如果这个时间是可接受的,那做好备份之后在系统闲时就可以做,这个方法会导致系统无法使用这个表,直到操作完毕,这个需要提醒你,如果不能接受,那就循del,几千万数据如果不停地小批量删除其实不会很慢的。 说的好。 其实 你要告诉领导的是 这个删除需要多久多久 ,然后发个通告。。。到时候停机1个小时,做完就好了。
靠 DELETE 删数据总运行时间是减少不了的,循环分批删主要的目的是减少对其他会话的影响。 而且即使强制终止循环任务,最多只回滚一批,前面的批次都已经成功删除了,不至于中断后又得从头做起。
期待你的测试结果
这个涉及锁升级的问题,一般来说,5000个行锁会升级成表/分区锁。所以一般批量删除的时候删除的数量不宜过多,1000比较合适,你可以考虑在删除条件上加个非聚集索引,加快查找速度,毕竟删除的步骤还是需要先把需要删除的数据找出来再操作。所以查德曼,删得也慢
几百万的数据如果没人用的前提下,插入临时表可能只需要4分钟左右,truncate接近实时,插回去可能只需要几分钟,整个过程可能不到15分钟,所有时间都是经验而已,没有理论支撑,仅供参考,如果这个时间是可接受的,那做好备份之后在系统闲时就可以做,这个方法会导致系统无法使用这个表,直到操作完毕,这个需要提醒你,如果不能接受,那就循del,几千万数据如果不停地小批量删除其实不会很慢的。
declare @count bigint,@sum_count bigint select @sum_count=count(1) from tb set @count=0 while @count<@sum_count begin delete top(@count) from tb where 限制条件 set @count=@count+10000 end
哥,先把需要保留的数据移到一个新表,实体表或临时表均可,然后把原表truncate,再把那个新表的数据插回去
[quote=引用 33 楼 yanian 的回复:] [quote=引用 32 楼 DBA_Huangzj 的回复:] [quote=引用 29 楼 yanian 的回复:] [quote=引用 23 楼 DBA_Huangzj 的回复:] 如果可以的话,把2014年的数据插入新表,然后truncate之后再导回去。如果不行的话,控制每次删除的量,循环delete
22,209
社区成员
121,730
社区内容
加载中
试试用AI创作助手写篇文章吧