Очистка таблиц в SQL SERVER: удаление времени - PullRequest
0 голосов
/ 09 апреля 2019

Я отвечаю за базу данных OLAP, где я заметил, что некоторая очистка принесет пользу. Мой первый анализ состоит из 500 миллионов строк, которые нужно удалить примерно в 50 таблицах. и это составляет в общем 70% каждой таблицы.

Я натолкнулся на какое-то решение, в котором мне нужно использовать таблицу tmp, отбросить оригинал, а затем снова принести его ... но у меня слишком много зависимостей, и я не хочу рисковать, проходя этот путь .

поэтому я выбрал другое решение: удаляя понемногу, чтобы не было блокировок таблицы.

это код, который я нашел здесь в переполнении стека, который я пытался улучшить удаление 4000 на 4000 строк.

set statistics time off

DECLARE @BATCHSIZE INT, @WAITFORVAL VARCHAR(8), @ITERATION INT, @TOTALROWS 
INT, @MAXRUNTIME VARCHAR(8), @BSTOPATMAXTIME BIT, @MSG VARCHAR(500)
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4000
SET @WAITFORVAL = '00:00:10'
SET @MAXRUNTIME = '18:00:00' -- 6 PM
SET @BSTOPATMAXTIME = 1 -- ENFORCE  6 PM STOP TIME
SET @ITERATION = 0 -- LEAVE THIS
SET @TOTALROWS = 0 -- LEAVE THIS


Begin TRY

WHILE @BATCHSIZE>0
    BEGIN

-- IF @BSTOPATMAXTIME = 1, THEN WE'LL STOP THE WHOLE JOB AT A SET TIME...
 IF (CONVERT(VARCHAR(8),GETDATE(),108) >= @MAXRUNTIME AND @BSTOPATMAXTIME=1) OR @ITERATION >2000
    BEGIN
        Return;
    END 


        DELETE top (@BATCHSIZE)
        FROM FacY where IdDimX not in (select IdDimX from  vwX)


SET @BATCHSIZE=@@ROWCOUNT
SET @ITERATION=@ITERATION+1
SET @TOTALROWS=@TOTALROWS+@BATCHSIZE
SET @MSG = 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR)
RAISERROR (@MSG, 0, 1) WITH NOWAIT
--COMMIT TRANSACTION;

 END
end TRY 
BEGIN CATCH
 IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        PRINT 'There is an error occured.  The database update failed.';
        ROLLBACK TRANSACTION;
    END;
END CATCH;

так что это заняло ок. от 30 минут до одного часа, чтобы удалить 4 миллиона строк.

Вместо этого я сейчас пытаюсь удалить 100 000 строк, и он сделал это за 1 минуту, затем я попробовал 1 миллион строк, и он сделал это за 5-6 минут. затем я пошел на более 10 миллионов строк, и это заняло 15 минут. (но журналы 50 ГБ были заполнены на 60%, так что я думаю, что это предел)

так что теперь мне интересно, не лучше ли, наконец, удалить большие блоки? так как это заняло бы много времени.

а что я не понимаю, так это то, почему на большие блоки уходит меньше времени?

спасибо за вашу помощь

1 Ответ

1 голос
/ 09 апреля 2019

Надеемся, что эта статья поможет понять, почему пакетное удаление может и будет постепенно замедляться по мере удаления, а также включает лучший метод удаления пакета:

https://michaeljswart.com/2014/09/take-care-when-scripting-batches/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...