Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Löschen von 1 Million Zeilen in SQL Server

Hier ist eine Struktur für eine Stapellöschung, wie oben vorgeschlagen. Versuchen Sie nicht 1M auf einmal...

Die Größe des Stapels und die Wartezeit sind offensichtlich ziemlich variabel und hängen von den Fähigkeiten Ihres Servers sowie von Ihrer Notwendigkeit ab, Konflikte zu verringern. Möglicherweise müssen Sie einige Zeilen manuell löschen, messen, wie lange sie dauern, und Ihre Stapelgröße an etwas anpassen, das Ihr Server verarbeiten kann. Wie oben erwähnt, kann alles über 5000 zu Sperren führen (was mir nicht bewusst war).

Dies sollte am besten nach Stunden erfolgen ... aber 1 Million Zeilen sind wirklich nicht viel, was SQL verarbeiten kann. Wenn Sie Ihre Nachrichten in SSMS ansehen, kann es eine Weile dauern, bis die Druckausgabe angezeigt wird, aber es wird nach mehreren Stapeln angezeigt. Beachten Sie jedoch, dass sie nicht in Echtzeit aktualisiert werden.

Bearbeiten:Stoppzeit @MAXRUNTIME hinzugefügt &@BSTOPATMAXTIME . Wenn Sie @BSTOPATMAXTIME setzen auf 1, stoppt das Skript von selbst zur gewünschten Zeit, sagen wir 8:00 Uhr. Auf diese Weise können Sie es so planen, dass es jeden Abend um Mitternacht beginnt und vor der Produktion um 8:00 Uhr endet.

Bearbeiten:Die Antwort ist ziemlich beliebt, also habe ich den RAISERROR hinzugefügt anstelle von PRINT pro Kommentar.

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