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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...