我有一个相当繁重的DELETE
操作,试图删除临时表中的行,这些行在另一个数据库表中没有匹配项。
DELETE FROM ##SendRecipients
WHERE Id NOT IN (SELECT RecipientId FROM MyDB.dbo.Results)
大约10分钟后,我收到以下错误消息:
由于'ACTIVE_TRANSACTION',数据库'tempdb'的事务日志已满。
我尝试为tempdb添加新的日志文件无济于事。现在,数据库文件与日志的.ldf
文件(分布在三个驱动器上)一起堵塞了服务器空间。
有没有办法告诉tempdb不要使用日志,至少只有这个操作?好像在tempdb中修改不了多少。
移动数据库中的临时表是否有助于替代?
首先,您可能不想使用全局临时表。它们的效用非常有限。
要减少日志记录,您可以这样做:
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
这将允许为每个语句重用事务日志空间。
另一种选择是使用表变量而不是临时表。永远不会记录对表变量的修改。