在删除记录过程中遇到了 千万级别以及上亿数据表中要删除一部分数据,如果 只是delete 一条语句执行,那就要锁表好久而且效率也很差,
因此用此方法来执行每次小范围的批量删除是个好办法~!
declare @begdate DATETIME declare @enddate DATETIME set @begdate=‘2020-01-05‘ --从0开始 set @enddate=‘2020-01-31‘ --循环次数 while (@begdate <= @enddate) BEGIN waitfor delay ‘00:00:02‘ --每次任务的间隔时间,避免长时间锁表造成其他用户的使用问题比如删一次 停5分钟;这里设置的时间是间隔2秒; --SET ROWCOUNT 10 更进一步的控制每次删除的记录数
DELETE FROM u_sale_c WHERE busno IN (SELECT busno FROM c_org_busi WHERE area NOT IN (SELECT strctgid FROM dpt_class WHERE strclass = ‘条件条件‘)) AND accdate = @begdate SELECT @@ROWCOUNT AS DelRows --打印执行结果 SET @begdate = dateadd (DAY, 1, @begdate) END
还有一种解决方法是 set rowcount 10 这种方法在当前的 连接中 会对所有的执行语句都 只列出前10条(跟临时表的作用范围相似),处理完后要 set rowcount 0 来释放 这点要注意~!