temp db的事务日志已满。如何不使用日志?

时间:2019-03-02 18:49:00

标签: sql-server tsql logging server ssms

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

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

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

  

由于以下原因,数据库'tempdb'的事务日志已满:   “ ACTIVE_TRANSACTION”。

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

是否有一种方法告诉tempdb不要至少在此操作中不要使用日志?似乎无法在tempdb中进行太多修改。

在数据库中移动临时表是否有帮助?

1 个答案:

答案 0 :(得分: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 

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

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

相关问题