sql >> Database >  >> RDS >> Sqlserver

1 miljoen rijen verwijderen in SQL Server

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


  1. Beste equivalent voor IsInteger in SQL Server

  2. Waarom behandelt PostgreSQL mijn query anders in een functie?

  3. Oracle INSERT in twee tabellen in één query

  4. FILE-privilege voor MySQL-sessie/gebruiker