批量删除数据行

时间:2016-05-27 12:51:46

标签: sql sql-server tsql

我是新手,所以请保持温柔。我需要在两个表中删除数百万行数据。当我使用sql脚本尝试此操作时,日志文件变得如此之大,以至于它占用了所有硬盘并且没有完成。我正在网上阅读一些文章说,如果批量删除数据,日志文件不会以同样的方式受到影响。数据库当前处于简单模式,并始终保持这种状态。这是我用来删除数据的脚本。

Delete from EligibilityInformation Where DateEntered <= DateAdd(day,-31, getdate())
Delete from EligibilityRequestLog Where ActualPostingDate <= DateAdd(day,-31, getdate())

有人可以帮我一个脚本,我可以添加为一个SQL作业,一次删除10,000行数据,直到所有行都被删除?我在网上找到了以下脚本。它可能超出我的需要。我添加了我的SQL脚本。

DECLARE @continue INT
DECLARE @rowcount INT

SET @continue = 1
WHILE @continue = 1
BEGIN
    PRINT GETDATE()
    SET ROWCOUNT 10000
    BEGIN TRANSACTION
    Delete from EligibilityInformation Where DateEntered <= DateAdd(day,-31, getdate())
    Delete from EligibilityRequestLog Where ActualPostingDate <= DateAdd(day,-31, getdate())
    SET @rowcount = @@rowcount 
    COMMIT
    PRINT GETDATE()
    IF @rowcount = 0
    BEGIN
        SET @continue = 0
    END
END

3 个答案:

答案 0 :(得分:1)

我假设你有一把主键。这应该适合你:

Delete Top 10000  
    From EligibilityInformation Where DateEntered <= DateAdd(day,-31, getdate())

这是一篇关于为什么你可以选择Top over Set Rowcount的文章 https://sqlstudies.com/2013/10/07/use-top-instead-of-set-rowcount/

答案 1 :(得分:1)

WHILE EXISTS(SELECT * FROM EligibilityInformation WHERE DateEntered <= DATEADD(DAY, -31, GETDATE()))
BEGIN
    PRINT GETDATE()
    DELETE (TOP 10000) FROM EligibilityInformation WHERE DateEntered <= DATEADD(DAY, -31, GETDATE())
    PRINT GETDATE()
END

WHILE EXISTS(SELECT * FROM EligibilityRequestLog WHERE ActualPostingDate <= DATEADD(DAY, -31, GETDATE()))
BEGIN
    PRINT GETDATE()
    DELETE (TOP 10000) FROM EligibilityRequestLog WHERE ActualPostingDate <= DATEADD(DAY, -31, GETDATE())
    PRINT GETDATE()
END

答案 2 :(得分:0)

我现在不在服务器上测试这种语法,但这是我使用的

select 1  -- to get a @@rowcount > 0 
while (@@rowcount > 0) 
begin 
   delete (top 1000) from table where ...
end  

将两者放在一个事务中只是很多开销,我看不到任何价值。充其量你会回滚一套(顶部)。如果你厌倦了在单个事务中包装循环,那么在集合中执行它不会增加任何内容。

你现在拥有的剧本只不过是

BEGIN TRANSACTION
Delete from EligibilityInformation Where DateEntered <= DateAdd(day,-31, getdate())
Delete from EligibilityRequestLog Where ActualPostingDate <= DateAdd(day,-31, getdate())
COMMIT