sql-server – 在SQL Server中删除1百万行

前端之家收集整理的这篇文章主要介绍了sql-server – 在SQL Server中删除1百万行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在研究客户端的数据库,由于软件中的错误,需要删除大约100万行.是否有一种有效的方法删除它们:
DELETE FROM table_1 where condition1 = 'value' ?

解决方法

这是上面建议的批量删除的结构.不要一次尝试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
原文链接:https://www.f2er.com/mssql/84408.html

猜你在找的MsSQL相关文章