Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Eliminazione di 1 milione di righe in SQL Server

Ecco una struttura per un'eliminazione in batch come suggerito sopra. Non provare 1M in una volta...

La dimensione del batch e il ritardo di attesa sono ovviamente abbastanza variabili e dipendono dalle capacità dei server, nonché dalla necessità di mitigare la contesa. Potrebbe essere necessario eliminare manualmente alcune righe, misurare quanto tempo impiegano e adattare le dimensioni del batch a qualcosa che il tuo server può gestire. Come accennato in precedenza, qualsiasi cosa oltre 5000 può causare il blocco (di cui non ero a conoscenza).

Sarebbe meglio farlo dopo ore ... ma 1 milione di righe non è davvero molto da gestire per SQL. Se guardi i tuoi messaggi in SSMS, potrebbe volerci del tempo prima che l'output di stampa venga visualizzato, ma dopo diversi batch, tieni presente che non si aggiornerà in tempo reale.

Modifica:aggiunto un tempo di arresto @MAXRUNTIME &@BSTOPATMAXTIME . Se imposti @BSTOPATMAXTIME a 1, lo script si fermerà da solo all'ora desiderata, diciamo alle 8:00. In questo modo puoi programmarlo di notte in modo che inizi a mezzanotte e si fermerà prima della produzione alle 8:00.

Modifica:la risposta è piuttosto popolare, quindi ho aggiunto RAISERROR al posto di PRINT per commenti.

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