Her er en struktur for en batch-sletning som foreslået ovenfor. Prøv ikke 1M på én gang...
Størrelsen på batchen og ventetiden på forsinkelsen er naturligvis ret varierende og vil afhænge af din serverkapacitet såvel som dit behov for at afbøde stridigheder. Du skal muligvis manuelt slette nogle rækker, måle hvor lang tid de tager, og justere din batchstørrelse til noget, din server kan håndtere. Som nævnt ovenfor kan alt over 5000 forårsage låsning (hvilket jeg ikke var klar over).
Dette ville bedst gøres efter timer... men 1M rækker er virkelig ikke meget for SQL at håndtere. Hvis du ser dine beskeder i SSMS, kan det tage et stykke tid, før udskriftsoutputtet vises, men det vil efter flere batches, bare vær opmærksom på, at det ikke opdateres i realtid.
Rediger:Tilføjet et stoptidspunkt @MAXRUNTIME
&@BSTOPATMAXTIME
. Hvis du indstiller @BSTOPATMAXTIME
til 1, stopper scriptet af sig selv på det ønskede tidspunkt, f.eks. kl. 8:00. På denne måde kan du planlægge det hver nat til at starte ved f.eks. midnat, og det vil stoppe før produktionen kl. 8.
Rediger:Svaret er ret populært, så jeg har tilføjet RAISERROR
i stedet for PRINT
pr. kommentarer.
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