临时数据库的事务日志已满。怎么不用日志?

问题描述 投票:1回答:1

我有一个相当繁重的DELETE操作,试图删除临时表中的行,这些行在另一个数据库表中没有匹配项。

DELETE FROM ##SendRecipients
WHERE Id NOT IN (SELECT RecipientId FROM MyDB.dbo.Results)

大约10分钟后,我收到以下错误消息:

由于'ACTIVE_TRANSACTION',数据库'tempdb'的事务日志已满。

我尝试为tempdb添加新的日志文件无济于事。现在,数据库文件与日志的.ldf文件(分布在三个驱动器上)一起堵塞了服务器空间。

有没有办法告诉tempdb不要使用日志,至少只有这个操作?好像在tempdb中修改不了多少。

移动数据库中的临时表是否有助于替代?

sql-server tsql logging server ssms
1个回答
3
投票

首先,您可能不想使用全局临时表。它们的效用非常有限。

要减少日志记录,您可以这样做:

select *
into #SendRecipients2
from #SendRecipients
WHERE Id IN (SELECT RecipientId FROM MyDB.dbo.Results)

哪个应该是最小化日志,或者如果您不在显式事务中

while 1=1
begin
   DELETE top (10000) FROM #SendRecipients
   WHERE Id NOT IN (SELECT RecipientId FROM MyDB.dbo.Results)
   if @@rowcount = 0 break;
end 

这将允许为每个语句重用事务日志空间。

另一种选择是使用表变量而不是临时表。永远不会记录对表变量的修改。

© www.soinside.com 2019 - 2024. All rights reserved.