Freigeben über


Löschen aller Zeilen mit TRUNCATE TABLE

Die TRUNCATE TABLE-Anweisung ist ein schnelles, effizientes Verfahren zum Löschen aller Zeilen einer Tabelle. TRUNCATE TABLE ist der DELETE-Anweisung ohne eine WHERE-Klausel ähnlich. TRUNCATE TABLE ist jedoch schneller und verwendet weniger Systemressourcen und Ressourcen für die Transaktionsprotokollierung.

Verglichen mit der DELETE-Anweisung hat TRUNCATE TABLE die folgenden Vorteile:

  • Es wird weniger Speicher für die Transaktionsprotokollierung verwendet.

    Die DELETE-Anweisung entfernt jede Zeile einzeln und protokolliert jede Löschung einzeln im Transaktionsprotokoll. Beim Entfernen der Daten mit TRUNCATE TABLE wird die Zuordnung der zum Speichern der Tabellendaten verwendeten Datenseiten aufgehoben, und nur die Zuordnungsaufhebungen der Datenseiten werden im Transaktionsprotokoll aufgezeichnet.

  • Es werden in der Regel weniger Sperren verwendet.

    Wenn die DELETE-Anweisung mithilfe einer Zeilensperre ausgeführt wird, wird jede Zeile in der Tabelle zum Löschen gesperrt. Mit TRUNCATE TABLE wird immer die Tabelle und die Seite gesperrt, jedoch nicht jede Zeile.

  • Ohne Verwendung einer Ausnahme verbleiben null Seiten in der Tabelle.

    Nach der Ausführung einer DELETE-Anweisung kann die Tabelle weiterhin leere Seiten enthalten. So können z. B. die Zuordnungen leerer Seiten in einem Heap nicht aufgehoben werden, ohne dass zumindest eine exklusive (LCK_M_K) Tabellensperre vorhanden ist. Wenn der Löschvorgang keine Tabellensperre verwendet, enthält die Tabelle (der Heap) viele leere Seiten. Bei Indizes kann der Löschvorgang leere Seiten hinterlassen, obwohl die Zuordnung dieser Seiten schnell durch einen im Hintergrund ausgeführten Cleanupprozess aufgehoben wird.

Wie bei DELETE verbleibt die Definition einer Tabelle, deren Inhalt mit TRUNCATE TABLE gelöscht wurde, in der Datenbank, zusammen mit ihren Indizes und anderen zugehörigen Objekten. Wenn die Tabelle eine Identitätsspalte enthält, wird der Zähler für diese Spalte auf den Ausgangswert zurückgesetzt, der für die Spalte definiert ist. Wenn kein Ausgangswert definiert wurde, wird der Standardwert 1 verwendet. Falls Sie den Wert des Identitätszählers erhalten möchten, verwenden Sie stattdessen DELETE.

Abschneiden großer Tabellen

Microsoft SQL Server führte die Funktionalität ein, Tabellen zu löschen oder abzuschneiden, die mehr als 128 Blöcke haben, ohne simultane Sperren für alle Blöcke aufrechtzuerhalten, die für den Löschvorgang erforderlich sind. Weitere Informationen finden Sie unter Löschen und Neuerstellen großer Objekte.

Beispiele

Mit dem folgenden Beispiel werden alle Daten aus der JobCandidate-Tabelle entfernt. SELECT-Anweisungen werden vor und nach der TRUNCATE TABLE-Anweisung eingeschossen, um die Ergebnisse zu vergleichen.

USE AdventureWorks2008R2;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO