Разделить запрос на удаление - PullRequest
0 голосов
/ 12 сентября 2018

Существует таблица a, которая имеет много связей с другими таблицами. Для некоторых из этих отношений установлен casade delete rule.

Я пытаюсь очистить таблицу a от всех данных, но сталкиваюсь с несколькими проблемами при использовании delete from a

  • Процесс удаления очень, очень медленный
  • Заполняется журнал транзакций (здесь возникает проблема с дисковым пространством), в результате чего запрос зависает.

У меня есть темп. перевел БД в режим простого восстановления, но проблема с tran.log сохраняется.

Я думал о разделении запроса на удаление, но пока не нашел более быстрого способа. Попытался top() ru попытаться разделить идентификаторы с помощью where clause.

Кто-нибудь получил какие-либо советы, чтобы быстрее очистить эту таблицу?

1 Ответ

0 голосов
/ 12 сентября 2018

Я построил следующий скрипт, чтобы разделить удаление на куски и сообщить о состоянии на вкладке «Сообщения» на основе первичного ключа «id».

DECLARE @countid int;
DECLARE @remaining int;
DECLARE @aantal int;
DECLARE @msg varchar(200);
SET @aantal = 100 -- Ammount that has to be deleted
SET @remaining = (select count(*) from Table);
SET @countid = (select MIN(id) + 100 from Table);

WHILE @remaining > 0
    BEGIN

        SET @msg = ('Remaining rows: ' + cast(@remaining as Varchar));
        raiserror (@msg,0,1) with nowait

        DELETE FROM Table
            WHERE id < @countid

        SET @remaining = @remaining - @@ROWCOUNT    
        SET @countid = @countid + @aantal

  CHECKPOINT -- Since the Recovery Model is Simple this clears the transaction log
END
...