正在批量删除-自动提交与开始/提交事务



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

问题:在删除大量数据期间,我收到一个错误:"数据库'[TableName]'的事务日志已满。"有人建议我删除部分数据。

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

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 trans用于单个操作(Delete Top(x)…)?我认为单个操作是自动提交的,因此不需要Begin/Commit?你能解释一下,哪个选项最适合避免完整事务日志的错误吗?开始/提交事务对于单个操作是否是必需的?非常感谢您的帮助。

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

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

您可以尝试在自己的作业中运行每个删除部分。在SQLServerManagementStudio中,有机会将"GO"与INT参数一起使用:请阅读此处:https://stackoverflow.com/a/3092835/5089204

有了这个非常有用的技巧,你可以删除你的区块,并在每个回合运行一个DBCC SHRINKFILE(N'YourLogFile',0,TRUNCATEONLY)

最新更新