Zde je struktura pro dávkové odstranění, jak je navrženo výše. Nezkoušejte 1M najednou...
Velikost dávky a zpoždění čekání jsou samozřejmě dosti variabilní a budou záviset na schopnostech vašich serverů a také na vaší potřebě zmírnit spor. Možná budete muset ručně odstranit některé řádky, změřit, jak dlouho to trvá, a upravit velikost dávky podle toho, co váš server zvládne. Jak bylo zmíněno výše, cokoliv nad 5000 může způsobit uzamčení (což jsem si nebyl vědom).
To by bylo nejlepší udělat po hodinách... ale 1 milion řádků opravdu není mnoho, co by SQL zvládlo. Pokud sledujete své zprávy v SSMS, může chvíli trvat, než se tiskový výstup zobrazí, ale po několika dávkách se zobrazí, jen si uvědomte, že se neaktualizuje v reálném čase.
Upravit:Přidán čas zastavení @MAXRUNTIME
&@BSTOPATMAXTIME
. Pokud nastavíte @BSTOPATMAXTIME
na 1, skript se sám zastaví v požadovaný čas, řekněme v 8:00. Tímto způsobem jej můžete naplánovat na noc tak, aby začal řekněme o půlnoci, a zastaví se před výrobou v 8:00.
Edit:Odpověď je velmi populární, takže jsem přidal RAISERROR
místo PRINT
za komentáře.
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