-
Jeśli usuwasz wszystkie wiersze z tej tabeli, najprostszą opcją jest Obcięcie tabeli, coś w rodzaju
TRUNCATE TABLE LargeTable GO
Obcięcie tabeli po prostu opróżni tabelę, nie można użyć klauzuli WHERE do ograniczenia liczby usuwanych wierszy i żadne wyzwalacze nie zostaną uruchomione.
-
Z drugiej strony, jeśli usuwasz więcej niż 80-90 procent danych, powiedzmy, że masz łącznie 11 milionów wierszy i chcesz usunąć 10 milionów innym sposobem byłoby wstawienie tych 1 milionów wierszy (rekordy, które chcesz zachować ) do innej tabeli pomostowej. Przytnij tę dużą tabelę i wstaw z powrotem te 1 milion wierszy.
-
Lub jeśli upuszczenie tej tabeli nie ma wpływu na uprawnienia/widoki lub inne obiekty, które mają tę dużą tabelę jako tabelę bazową, możesz przenieść te stosunkowo małe ilości wierszy do innej tabeli, upuścić tę tabelę i utworzyć inną tabelę z tym samym schemat i zaimportuj te wiersze z powrotem do tej ex-Large tabeli.
-
Ostatnią opcją, o której mogę pomyśleć, jest zmiana
Recovery Mode to SIMPLE
a następnie usuń wiersze w mniejszych partiach za pomocą pętli while, takiej jak:DECLARE @Deleted_Rows INT; SET @Deleted_Rows = 1; WHILE (@Deleted_Rows > 0) BEGIN -- Delete some small number of rows at a time DELETE TOP (10000) LargeTable WHERE readTime < dateadd(MONTH,-7,GETDATE()) SET @Deleted_Rows = @@ROWCOUNT; END
i nie zapomnij zmienić trybu odzyskiwania z powrotem na pełny i myślę, że musisz wykonać kopię zapasową, aby była w pełni skuteczna (tryby zmiany lub odzyskiwania).