在一堆中删除 - 自动提交与开始/提交事务

时间:2015-12-28 10:24:20

标签: sql-server autocommit

我在解决数据库问题时遇到了问题。我试着回答一下,但我找到了两个含糊不清的解决方案。

问题: 在删除大量数据期间,我收到错误:'数据库的事务日志' [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 tran(删除Top(x)....)?我认为单个操作是自动提交 - 因此不需要Begin / Commit? 你能否解释一下哪个选项最适合避免关于完整事务日志的错误?单个操作是否需要Begin / Commit tran? 非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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

您可以尝试在自己的作业中运行每个删除部分。在SQL Server Management Studio中,有机会使用带有INT参数的“GO”:在此处阅读:https://stackoverflow.com/a/3092835/5089204

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