我有一个相当繁重的DELETE
操作,它试图删除临时表中的行,而该行在另一个数据库表中没有匹配项。
DELETE FROM ##SendRecipients
WHERE Id NOT IN (SELECT RecipientId FROM MyDB.dbo.Results)
大约10分钟后,我收到以下错误消息:
由于以下原因,数据库'tempdb'的事务日志已满: “ ACTIVE_TRANSACTION”。
我为tempdb添加新日志文件的尝试无济于事。现在,数据库文件以及日志的.ldf
文件(分布在三个驱动器上)已经阻塞了服务器空间。
是否有一种方法告诉tempdb不要至少在此操作中不要使用日志?似乎无法在tempdb中进行太多修改。
在数据库中移动临时表是否有帮助?
答案 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
这将允许为每个语句重用事务日志空间。
另一个选择是使用表变量而不是临时表。永远不会记录对表变量的修改。