解决方法
这是上面建议的批量删除的结构.不要一次尝试1M …
批处理的大小和waitfor延迟显然是可变的,并且取决于您的服务器功能以及缓解争用的需要.您可能需要手动删除某些行,测量它们的耗时,并将批量大小调整为服务器可以处理的内容.如上所述,超过5000的任何东西都可能导致锁定(我不知道).
这最好在数小时之后完成……但是,对于sql来说,1M行真的不是很多.如果您在SSMS中观看消息,可能需要一段时间才能显示打印输出,但是经过几批后,请注意它不会实时更新.
编辑:添加了停止时间@MAXRUNTIME& @BSTOPATMAXTIME.如果将@BSTOPATMAXTIME设置为1,则脚本将在所需的时间(例如上午8:00)自行停止.通过这种方式,您可以在夜间开始计划,并在早上8点开始生产.
编辑:答案非常受欢迎,所以我根据评论添加了RAISERROR来代替PRINT.
DECLARE @BATCHSIZE INT,@WAITFORVAL VARCHAR(8),@ITERATION INT,@TOTALROWS INT,@MAXRUNTIME VARCHAR(8),@BSTOPATMAXTIME BIT,@MSG VARCHAR(500) SET DEADLOCK_PRIORITY LOW; SET @BATCHSIZE = 4000 SET @WAITFORVAL = '00:00:10' SET @MAXRUNTIME = '08:00:00' -- 8AM SET @BSTOPATMAXTIME = 1 -- ENFORCE 8AM STOP TIME SET @ITERATION = 0 -- LEAVE THIS SET @TOTALROWS = 0 -- LEAVE THIS WHILE @BATCHSIZE>0 BEGIN -- IF @BSTOPATMAXTIME = 1,THEN WE'LL STOP THE WHOLE JOB AT A SET TIME... IF CONVERT(VARCHAR(8),GETDATE(),108) >= @MAXRUNTIME AND @BSTOPATMAXTIME=1 BEGIN RETURN END DELETE TOP(@BATCHSIZE) FROM SOMetaBLE WHERE 1=2 SET @BATCHSIZE=@@ROWCOUNT SET @ITERATION=@ITERATION+1 SET @TOTALROWS=@TOTALROWS+@BATCHSIZE SET @MSG = 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR) RAISERROR (@MSG,1) WITH NOWAIT WAITFOR DELAY @WAITFORVAL END