微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/mssql/84408.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐