Журнал транзакций для temp db заполнен.Как не использовать логи? - PullRequest
0 голосов
/ 02 марта 2019

У меня довольно тяжелая DELETE операция, которая пытается удалить строки во временной таблице, которые не совпадают в другой таблице базы данных.

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

Примерно через 10 минут я получаю следующеесообщение об ошибке:

Журнал транзакций для базы данных 'tempdb' переполнен из-за 'ACTIVE_TRANSACTION'.

Мои попытки добавить новый файл журнала для базы данных tempdb были нетпомогло.И теперь файлы базы данных вместе с .ldf файлами журнала (распределенными по трем дискам) забили серверное пространство.

Есть ли способ сказать tempdb не использовать журнал, по крайней мере, толькодля этой операции?Похоже, что в базе данных tempdb нельзя что-то сильно изменить.

Помогает ли перемещение временных таблиц внутри баз данных в качестве альтернативы?

1 Ответ

0 голосов
/ 02 марта 2019

Во-первых, вы, вероятно, не хотите использовать глобальную временную таблицу.Их утилита очень ограничена.

Чтобы уменьшить ведение журнала, вы можете сделать следующее:

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 

, что позволит повторно использовать пространство журнала транзакций для каждого оператора.

Другой вариант - использовать переменную таблицы вместо временной таблицы.Изменения в табличных переменных никогда не регистрируются.

...