(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 TRUNCATEi DELETE:
- Wykorzystanie miejsca do rejestrowania:
TRUNCATEzwalnia tylko strony / zakresy *, podczas gdy DELETErejestruje pojedyncze wiersze.
- Zablokuj użycie:
TRUNCATEgeneralnie używa mniej blokad, ponieważ wymaga blokady tabeli i blokad strony, w przeciwieństwie do DELETEblokad wierszy **.
IDENTITYsekwencje: TRUNCATEresetuje sekwencję tożsamości w tabeli, jeśli jest obecna.
(* Zakres = 8 stron. TRUNCATELoguje / 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 TABLEpotencjalnie 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 TABLEjest zdecydowanie lepszy niż DELETE FROM TABLEwtedy, gdy opróżniasz tabelę, ale chcesz zachować strukturę (NB: TRUNCATEnie 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>' afterTRUNCATE /DELETE`, aby optymalizator zapytań nie był wyzwalany przez stare statystyki.
TRUNCATE TABLEzamiastDELETE FROM.