sql >> Databáze >  >> RDS >> Sqlserver

Odstranění 1 milionu řádků v SQL Server

Zde je struktura pro dávkové odstranění, jak je navrženo výše. Nezkoušejte 1M najednou...

Velikost dávky a zpoždění čekání jsou samozřejmě dosti variabilní a budou záviset na schopnostech vašich serverů a také na vaší potřebě zmírnit spor. Možná budete muset ručně odstranit některé řádky, změřit, jak dlouho to trvá, a upravit velikost dávky podle toho, co váš server zvládne. Jak bylo zmíněno výše, cokoliv nad 5000 může způsobit uzamčení (což jsem si nebyl vědom).

To by bylo nejlepší udělat po hodinách... ale 1 milion řádků opravdu není mnoho, co by SQL zvládlo. Pokud sledujete své zprávy v SSMS, může chvíli trvat, než se tiskový výstup zobrazí, ale po několika dávkách se zobrazí, jen si uvědomte, že se neaktualizuje v reálném čase.

Upravit:Přidán čas zastavení @MAXRUNTIME &@BSTOPATMAXTIME . Pokud nastavíte @BSTOPATMAXTIME na 1, skript se sám zastaví v požadovaný čas, řekněme v 8:00. Tímto způsobem jej můžete naplánovat na noc tak, aby začal řekněme o půlnoci, a zastaví se před výrobou v 8:00.

Edit:Odpověď je velmi populární, takže jsem přidal RAISERROR místo PRINT za komentáře.

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. Vystoupejte výš v cloudu s MariaDB SkySQL

  2. Proč dostanu Postup očekává parametr '@statement' typu 'ntext/nchar/nvarchar'. když se pokusím použít sp_executesql?

  3. Jak mohu zavést více podmínek v operátoru LIKE?

  4. MySQL – vztah jeden k jednomu?