Hier is een structuur voor een batchverwijdering zoals hierboven voorgesteld. Probeer niet 1M tegelijk...
De grootte van de batch en de wachttijd voor het wachten is duidelijk nogal variabel en hangt af van de mogelijkheden van uw server, evenals van uw behoefte om geschillen te verminderen. Mogelijk moet u enkele rijen handmatig verwijderen, meten hoe lang ze duren en uw batchgrootte aanpassen aan iets dat uw server aankan. Zoals hierboven vermeld, kan alles boven de 5000 vergrendeling veroorzaken (waarvan ik me niet bewust was).
Dit zou het beste na uren kunnen worden gedaan ... maar 1 miljoen rijen is echt niet veel voor SQL om te verwerken. Als u uw berichten in SSMS bekijkt, kan het even duren voordat de afdrukuitvoer wordt weergegeven, maar na verschillende batches zal dit gebeuren. Houd er rekening mee dat deze niet in realtime wordt bijgewerkt.
Bewerken:een stoptijd toegevoegd @MAXRUNTIME
&@BSTOPATMAXTIME
. Als u @BSTOPATMAXTIME
. instelt tot 1, stopt het script vanzelf op het gewenste tijdstip, bijvoorbeeld 8:00 uur. Op deze manier kun je het 's avonds plannen om bijvoorbeeld middernacht te beginnen, en het stopt vóór de productie om 8 uur 's ochtends.
Bewerken:Antwoord is behoorlijk populair, dus ik heb de RAISERROR
. toegevoegd in plaats van PRINT
per opmerkingen.
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