(To był pierwotnie komentarz do odpowiedzi @ DaveE, ale umieściłem go we własnej odpowiedzi, ponieważ stał się długi)
TRUNCATE
jest zarejestrowaną operacją. Musi być inaczej, ponieważ nie jest zgodny z ACID. Jednak różnice między TRUNCATE
i DELETE
:
- Wykorzystanie miejsca do rejestrowania:
TRUNCATE
zwalnia tylko strony / zakresy *, podczas gdy DELETE
rejestruje pojedyncze wiersze.
- Zablokuj użycie:
TRUNCATE
generalnie używa mniej blokad, ponieważ wymaga blokady tabeli i blokad strony, w przeciwieństwie do DELETE
blokad wierszy **.
IDENTITY
sekwencje: TRUNCATE
resetuje sekwencję tożsamości w tabeli, jeśli jest obecna.
(* Zakres = 8 stron. TRUNCATE
Loguje / usuwa zakresy, jeśli wszystkie są z tej samej tabeli, w przeciwnym razie loguje / usuwa strony z zakresu mieszanego.
** Jednym z efektów ubocznych jest to, że DELETE FROM TABLE
potencjalnie można pozostawić puste strony przydzielone do tabeli, w zależności od tego, czy operacja może uzyskać wyłączną blokadę tabeli, czy nie.)
Tak więc (wracając do pierwotnego pytania), TRUNCATE TABLE
jest zdecydowanie lepszy niż DELETE FROM TABLE
wtedy, gdy opróżniasz tabelę, ale chcesz zachować strukturę (NB: TRUNCATE
nie można jej używać w tabeli, do której odwołuje się klucz obcy z innej tabeli).
Jak zauważono w komentarzu @ Tullo, sprawdź również model odzyskiwania bazy danych - jeśli jest pełny, albo zacznij robić kopie zapasowe dziennika, albo zmień model odzyskiwania na prosty. Po wykonaniu którejkolwiek z tych czynności prawdopodobnie będziesz chciał zmniejszyć plik dziennika jako operację jednorazową (Uwaga: tylko plik dziennika ) w celu odzyskania całego wolnego miejsca.
Na koniec jeszcze jedna rzecz, o której należy pamiętać - statystyki tabel. uruchom UPDATE STATISTICS <TABLENAME>' after
TRUNCATE /
DELETE`, aby optymalizator zapytań nie był wyzwalany przez stare statystyki.
TRUNCATE TABLE
zamiastDELETE FROM
.