Ето структура за групово изтриване, както е предложено по-горе. Не опитвайте 1M наведнъж...
Размерът на пакета и забавянето на чакане очевидно са доста променливи и ще зависят от възможностите на сървърите ви, както и от необходимостта ви да смекчите конкуренцията. Може да се наложи ръчно да изтриете някои редове, измервайки колко време отнемат, и да коригирате размера на партидата си към нещо, с което вашият сървър може да се справи. Както споменахме по-горе, всичко над 5000 може да причини заключване (за което не знаех).
Това би било най-добре да се направи след часове... но 1M редове наистина не са много за обработка на SQL. Ако гледате съобщенията си в SSMS, може да отнеме известно време, преди изходът за печат да се покаже, но това ще стане след няколко партиди, само имайте предвид, че няма да се актуализира в реално време.
Редактиране:Добавено е време за спиране @MAXRUNTIME
&@BSTOPATMAXTIME
. Ако зададете @BSTOPATMAXTIME
до 1, скриптът ще спре сам в желаното време, да речем 8:00 сутринта. По този начин можете да планирате всяка вечер да започне да кажем в полунощ и ще спре преди производството в 8 сутринта.
Редактиране:Отговорът е доста популярен, затова добавих RAISERROR
вместо PRINT
на коментари.
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 = '08:00:00' -- 8AM
SET @BSTOPATMAXTIME = 1 -- ENFORCE 8AM STOP TIME
SET @ITERATION = 0 -- LEAVE THIS
SET @TOTALROWS = 0 -- LEAVE THIS
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
BEGIN
RETURN
END
DELETE TOP(@BATCHSIZE)
FROM SOMETABLE
WHERE 1=2
SET @[email protected]@ROWCOUNT
SET @[email protected]+1
SET @[email protected][email protected]
SET @MSG = 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR)
RAISERROR (@MSG, 0, 1) WITH NOWAIT
WAITFOR DELAY @WAITFORVAL
END