批量删除 - 自动提交与 begin/commit 事务

Deleting in bunch - autocommit vs begin/commit transaction

我在解决数据库中的问题时遇到了问题。我试图寻找一个答案,但我发现了两个模棱两可的解决方案。

问题: 在删除大量数据期间,我收到错误消息:'The transaction log for database '[TableName]' is full.'我被建议删除部分数据。

我找到了两种不同的方法来解决这个问题:

1)

DECLARE @Count INT
Declare @for_delete INT
Declare @chunk_size INT
SELECT @chunk_size=100000
SELECT @Count = 0
select @for_delete=count(*) from [Your big table] where  [Your Where Clause]
While (@Count < @for_delete)
BEGIN
SELECT @Count = @Count + @chunk_size
BEGIN TRAN
DELETE top(@chunk_size) FROM  [Your big table] where  [Your Where Clause]
COMMIT TRAN
END

2)

WHILE EXISTS(SELECT TOP 1 1 FROM Table)
BEGIN
DELETE TOP (10000) FROM Table
END

我的问题是,为什么在第一个例子中,有一个 Begin/Commit tran 用于单个操作(Delete Top(x)....)?我认为单一操作是自动提交 - 因此 Begin/Commit 不是必需的? 您能解释一下哪个选项最适合避免有关完整事务日志的错误吗? Begin/Commit tran 是单次操作所必需的吗? 非常感谢您的帮助。

可能不需要打开和关闭事务,但这是一个很好的做法。

由于这两种方法都运行在一个大作业中,隐式事务在作业结束前不会关闭。

您可以尝试 运行 每个删除部分都在其自己的作业中。在 SQL Server Management Studio 中,有机会使用带有 INT 参数的 "GO":阅读此处:

使用这个非常有用的技巧,您可以删除您的区块,并且 运行 每次 DBCC SHRINKFILE(N'YourLogFile',0,TRUNCATEONLY)