我是新手,所以请保持温柔。我需要在两个表中删除数百万行数据。当我使用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
答案 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