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

Sletning af 1 million rækker i SQL Server

Her er en struktur for en batch-sletning som foreslået ovenfor. Prøv ikke 1M på én gang...

Størrelsen på batchen og ventetiden på forsinkelsen er naturligvis ret varierende og vil afhænge af din serverkapacitet såvel som dit behov for at afbøde stridigheder. Du skal muligvis manuelt slette nogle rækker, måle hvor lang tid de tager, og justere din batchstørrelse til noget, din server kan håndtere. Som nævnt ovenfor kan alt over 5000 forårsage låsning (hvilket jeg ikke var klar over).

Dette ville bedst gøres efter timer... men 1M rækker er virkelig ikke meget for SQL at håndtere. Hvis du ser dine beskeder i SSMS, kan det tage et stykke tid, før udskriftsoutputtet vises, men det vil efter flere batches, bare vær opmærksom på, at det ikke opdateres i realtid.

Rediger:Tilføjet et stoptidspunkt @MAXRUNTIME &@BSTOPATMAXTIME . Hvis du indstiller @BSTOPATMAXTIME til 1, stopper scriptet af sig selv på det ønskede tidspunkt, f.eks. kl. 8:00. På denne måde kan du planlægge det hver nat til at starte ved f.eks. midnat, og det vil stoppe før produktionen kl. 8.

Rediger:Svaret er ret populært, så jeg har tilføjet RAISERROR i stedet for PRINT pr. 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. Forenkle indlejret store og små bogstaver, når sætning

  2. MySQL SELECT AS kombinere to kolonner til én

  3. datamanipulation er ikke lovlig på denne visning, der sker i en brugertabel

  4. implicitte indre sammenføjninger - er de ligeværdige?