Zu beachten ist, dass WENN alle Daten über das DELETE
(d.h. ohne WHERE
-Klausel) aus der Tabelle entfernt werden, dann, solange a) die Berechtigungen dies zulassen und b) keine FKs auf die Tabelle verweisen (was hier der Fall zu sein scheint), TRUNCATE TABLE
bevorzugt wird, da es effizienter DELETE
durchführt und gleichzeitig den IDENTITY
-Seed zurücksetzt. Die folgenden Details stammen von der MSDN-Seite für TRUNCATE TABLE:
Verglichen mit dem DELETE-Statement hat TRUNCATE TABLE die folgenden Vorteile:
-
Weniger Transaktionsprotokollplatz wird verwendet.
Das DELETE-Statement entfernt Zeilen einzeln und protokolliert einen Eintrag im Transaktionsprotokoll für jede gelöschte Zeile. TRUNCATE TABLE entfernt die Daten, indem die Datenseiten, die zur Speicherung der Tabellendaten verwendet werden, deallokiert werden, und protokolliert nur die Seiten-Deallokationen im Transaktionsprotokoll.
-
In der Regel werden weniger Sperren verwendet.
Wenn das DELETE-Statement unter Verwendung einer Zeilensperre ausgeführt wird, wird jede Zeile in der Tabelle für die Löschung gesperrt. TRUNCATE TABLE sperrt immer die gesamte Tabelle (einschließlich einer Schemasperre (SCH-M)) und Seite, aber nicht jede Zeile.
-
Ohne Ausnahme werden null Seiten in der Tabelle zurückgelassen.
Nach Ausführung eines DELETE-Statements kann die Tabelle weiterhin leere Seiten enthalten. Zum Beispiel können leere Seiten in einem Heap nicht ohne mindestens eine exklusive (LCK_M_X) Tabellensperre deallokiert werden. Wenn die Löschoperation keine Tabellensperre verwendet, wird die Tabelle (der Heap) viele leere Seiten enthalten. Bei Indizes kann die Löschoperation leere Seiten zurücklassen, obwohl diese Seiten schnell von einem Hintergrundbereinigungsprozess deallokiert werden.
Wenn die Tabelle eine Identitätsspalte enthält, wird der Zähler für diese Spalte auf den für die Spalte definierten Seed-Wert zurückgesetzt. Wenn kein Seed definiert wurde, wird der Standardwert 1 verwendet. Um den Identitätszähler beizubehalten, verwenden Sie stattdessen DELETE.
Also wird das Folgende:
DELETE FROM [MyTable];
DBCC CHECKIDENT ('[MyTable]', RESEED, 0);
Einfach zu:
TRUNCATE TABLE [MyTable];
Bitte beachten Sie die Dokumentation zu TRUNCATE TABLE
(oben verlinkt) für zusätzliche Informationen zu Einschränkungen usw.