sql >> Databasteknik >  >> RDS >> Sqlserver

Ta bort 1 miljon rader i SQL Server

Här är en struktur för en batchradering som föreslagits ovan. Försök inte 1M på en gång...

Storleken på partiet och väntan på fördröjning är uppenbarligen ganska varierande och skulle bero på dina servrars kapacitet, såväl som ditt behov av att mildra konflikter. Du kan behöva ta bort några rader manuellt, mäta hur lång tid de tar och justera din batchstorlek till något som din server kan hantera. Som nämnts ovan kan allt över 5000 orsaka låsning (vilket jag inte var medveten om).

Detta skulle bäst göras efter timmar... men 1M rader är verkligen inte mycket för SQL att hantera. Om du tittar på dina meddelanden i SSMS kan det ta ett tag för utskriften att visas, men det kommer efter flera omgångar, bara tänk på att det inte kommer att uppdateras i realtid.

Redigera:Lade till en stopptid @MAXRUNTIME &@BSTOPATMAXTIME . Om du ställer in @BSTOPATMAXTIME till 1, kommer skriptet att stanna av sig själv vid önskad tid, säg 8:00 AM. På så sätt kan du schemalägga det varje natt så att det börjar t.ex. midnatt, och det kommer att sluta före produktionen kl. 08.00.

Edit:Svaret är ganska populärt, så jag har lagt till RAISERROR i stället för PRINT per 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


  1. Hur kopierar eller importerar jag Oracle-scheman mellan två olika databaser på olika servrar?

  2. Konstig tidszonshantering i en Postgres-databas

  3. Hur man väljer data från MYSQL med LIMIT innehåller ett element med värde t.ex. 1

  4. Datum till millisekunder / millisekunder till datum