2015-12-28 46 views
0

我在数据库中解决问题期间遇到问题。我试图寻找答案,但我发现了两个模棱两可的决议。在群中删除 - 自动提交与开始/提交事务

问题: 在删除大量数据期间,我收到一个错误:'数据库事务日志'[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 

我的问题是,为什么在第一个例子,有一个开始/提交单一操作(删除顶部(x)....)?我认为单个操作是自动提交 - 因此开始/提交不是必需的? 能否请你解释一下哪个选项最适合避免关于完整事务日志的错误?单次操作是否需要开始/执行转换? 非常感谢您的帮助。

+0

这是您只需要一次的东西,还是您需要更频繁或作为某个业务流程的一部分? – Shnugo

+0

这是业务流程的一部分。我需要调整所有程序(负责删除数据)以删除部分数据。 – Anakhin

+0

这些删除操作会在用户在表格中工作时运行吗?或者这会是“夜间清理”吗? – Shnugo

回答

0

打开和关闭事务可能不是必需的,但这是一个好习惯。

由于两种方法都在一个大工作内运行,所以隐式事务在作业结束之前未关闭。

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

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

+0

非常感谢Shnugo! – Anakhin