Я отвечаю за базу данных 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%, так что я думаю, что это предел)
так что теперь мне интересно, не лучше ли, наконец, удалить большие блоки? так как это заняло бы много времени.
а что я не понимаю, так это то, почему на большие блоки уходит меньше времени?
спасибо за вашу помощь