Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Usuwanie 1 miliona wierszy w SQL Server

Oto struktura usuwania grupowego sugerowana powyżej. Nie próbuj 1M na raz...

Rozmiar partii i opóźnienie oczekiwania są oczywiście dość zmienne i zależą od możliwości serwera, a także od potrzeby złagodzenia rywalizacji. Może być konieczne ręczne usunięcie niektórych wierszy, zmierzenie czasu ich trwania i dostosowanie rozmiaru partii do tego, co może obsłużyć Twój serwer. Jak wspomniano powyżej, wszystko powyżej 5000 może spowodować zablokowanie (o czym nie wiedziałem).

Najlepiej byłoby to zrobić po godzinach... ale 1 mln wierszy to naprawdę niewiele dla SQL do obsłużenia. Jeśli oglądasz swoje wiadomości w SSMS, może minąć trochę czasu, zanim wydruk się pojawi, ale po kilku partiach, pamiętaj, że nie będzie aktualizowany w czasie rzeczywistym.

Edycja:dodano czas zatrzymania @MAXRUNTIME &@BSTOPATMAXTIME . Jeśli ustawisz @BSTOPATMAXTIME do 1, skrypt zatrzyma się samoczynnie o pożądanej godzinie, powiedzmy 8:00. W ten sposób możesz zaplanować conocne rozpoczęcie, powiedzmy o północy, i zatrzyma się przed produkcją o 8 rano.

Edycja:odpowiedź jest dość popularna, więc dodałem RAISERROR zamiast PRINT za komentarze.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie wyrażenia regularnego w ramach procedury składowanej

  2. Uzyskiwanie podzbioru rekordów wraz z całkowitą liczbą rekordów

  3. Czy te dwa zapytania są takie same — GROUP BY vs. DISTINCT?

  4. Nie można przekazać parametrów wejściowych do procedury składowanej

  5. Co to jest SQL Operations Studio (SQLOPS)?