我在解决数据库问题时遇到了问题。我试着回答一下,但我找到了两个含糊不清的解决方案。
问题: 在删除大量数据期间,我收到错误:'数据库的事务日志' [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? 非常感谢您的帮助。
答案 0 :(得分:0)
可能不需要打开和关闭交易,但这是一种很好的做法。
由于这两种方法都在一个大工作中运行,因此在作业结束之前不会关闭隐式事务。
您可以尝试在自己的作业中运行每个删除部分。在SQL Server Management Studio中,有机会使用带有INT参数的“GO”:在此处阅读:https://stackoverflow.com/a/3092835/5089204
通过这个非常有用的技巧,你可以删除你的块并在每个回合都运行DBCC SHRINKFILE(N'YourLogFile',0,TRUNCATEONLY)
。