我在数据库中解决问题期间遇到问题。我试图寻找答案,但我发现了两个模棱两可的决议。在群中删除 - 自动提交与开始/提交事务
问题: 在删除大量数据期间,我收到一个错误:'数据库事务日志'[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)....)?我认为单个操作是自动提交 - 因此开始/提交不是必需的? 能否请你解释一下哪个选项最适合避免关于完整事务日志的错误?单次操作是否需要开始/执行转换? 非常感谢您的帮助。
这是您只需要一次的东西,还是您需要更频繁或作为某个业务流程的一部分? – Shnugo
这是业务流程的一部分。我需要调整所有程序(负责删除数据)以删除部分数据。 – Anakhin
这些删除操作会在用户在表格中工作时运行吗?或者这会是“夜间清理”吗? – Shnugo