(Dies war ursprünglich ein Kommentar zu @ DaveEs Antwort, aber ich habe ihn in eine eigene Antwort eingefügt, weil er lang wurde.)
TRUNCATE ist eine protokollierte Operation. Es muss ansonsten nicht ACID-konform sein. Unterschiede zwischen TRUNCATEund DELETE:
- Nutzung des
TRUNCATEProtokollspeicherplatzes : Protokolliert nur die freigegebenen Seiten / Bereiche *, während DELETEeinzelne Zeilen protokolliert werden.
TRUNCATEVerwendung von Sperren : Im Allgemeinen werden weniger Sperren verwendet, da eine Tabellensperre und Seitensperren erforderlich sind, im Gegensatz zu DELETEZeilensperren **.
IDENTITYsequence: TRUNCATESetzt die Identitätssequenz für eine Tabelle zurück, falls vorhanden.
(* Ein Extent = 8 Seiten TRUNCATEprotokolliert / entfernt Extents, wenn sie alle aus dieser einen Tabelle stammen, andernfalls werden Seiten aus gemischten Extents protokolliert / entfernt.
** Ein Nebeneffekt davon ist , dass DELETE FROM TABLEmöglicherweise leere Seiten der Tabelle zugeordnet werden kann, je nachdem , ob die Operation eine exklusive Tabellensperre bekommen kann oder nicht.)
Dies ist (zurück zur ursprünglichen Frage) eindeutig TRUNCATE TABLEbesser, als DELETE FROM TABLEwenn Sie die Tabelle leeren, aber die Struktur beibehalten möchten ( TRUNCATEHinweis : Kann nicht für eine Tabelle verwendet werden, auf die ein Fremdschlüssel aus einer anderen Tabelle verweist).
Überprüfen Sie, wie in @ Tullos Kommentar erwähnt, auch das Wiederherstellungsmodell Ihrer Datenbank. Wenn es voll ist, müssen Sie entweder mit dem Erstellen von Protokollsicherungen beginnen oder Ihr Wiederherstellungsmodell in "Einfach" ändern. Sobald Sie eine dieser beiden getan haben, werden Sie wahrscheinlich wollen Ihre Log - Datei schrumpfen als einmalige Operation (NB: Protokolldatei nur ), um alle , dass der freie Raum zurückzufordern.
Zum Schluss noch etwas zu beachten - Tabellenstatistik. Führen Sie UPDATE STATISTICS <TABLENAME>' afterTRUNCATE /DELETE` aus, damit das Abfrageoptimierungsprogramm nicht durch alte Statistiken gestört wird.
TRUNCATE TABLEanstelle vonDELETE FROM.