T-SQL stellt zwei Schlüsselwörter bereit, mit denen Sie Daten aus einer Tabelle löschen können. Sie sind LÖSCHEN und TRUNCATE . Diese ähneln sich in dem, was sie tun, verwenden jedoch sehr unterschiedliche Methoden. In diesem Artikel diskutieren wir zugrunde liegende Mechanismen für diese Schlüsselwörter.
Ein Unterschied zwischen TRUNCATE und DELETE
KÜRZEN:
- TRUNCATE ist ein DDL-Befehl.
- TRUNCATE TABLE sperrt immer die Tabelle und die Seite. Es sperrt jedoch nicht jede Zeile.
- Die WHERE-Bedingung kann nicht verwendet werden.
- Der Befehl entfernt alle Daten.
- TRUNCATE TABLE kann keinen Trigger aktivieren, da die Operation keine einzelnen Zeilenlöschungen protokolliert.
- Schneller in der Leistung, da keine Protokolle geführt werden.
- Rollback ist möglich.
LÖSCHEN:
- DELETE ist ein DML-Befehl.
- Die DELETE-Anweisung verwendet während der Ausführung eine Zeilensperre. Jede Zeile in der Tabelle ist zum Löschen gesperrt.
- Sie können Filter in der WHERE-Klausel angeben.
- Der Befehl löscht angegebene Daten, wenn die WHERE-Bedingung existiert.
- DELETE aktiviert einen Trigger, da die Vorgänge einzeln protokolliert werden.
- DELETE ist langsamer als TRUNCATE, weil es Protokolle führt.
- Rollback ist möglich.
Wie lösche ich Daten mit Hilfe von TRUNCATE?
Im folgenden Beispiel werden alle Daten aus der Person-Tabelle entfernt. AUSWÄHLEN Anweisungen werden vor und nach der TRUNCATE TABLE eingefügt Anweisung zum Vergleichen der Ergebnisse.
USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM Person.Person;
GO
TRUNCATE TABLE Person.Person;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM Person.Person;
GO
Lassen Sie uns einige Vorteile hervorheben.
Die TRUNCATE TABLE Der Befehl löscht alle Zeilen aus einer Tabelle, indem er die Zuordnung der Datenseiten aufhebt, die zum Speichern der Tabellendaten verwendet werden. Sobald die Operation abgeschlossen ist, enthält die Tabelle null Seiten. Es führt keine Protokollierung für die einzelnen Zeilenlöschungen durch. Der Befehl zeichnet die Seitenfreigabe im Transaktionsprotokoll auf. Das TRUNCATE Der Befehl verbraucht weniger Protokollspeicherplatz. Typischerweise werden weniger Sperren verwendet. Der Befehl löscht alle Zeilen aus einer Tabelle, aber die Tabellenstruktur und ihre Spalten, Einschränkungen, Indizes usw. bleiben erhalten. Um den Tisch zu entfernen. Sie müssen DROP TABLE verwenden .
Wenn eine Tabelle eine Identitätsspalte enthält, wird der Zähler für diese Spalte auf den für die Spalte definierten Ausgangswert zurückgesetzt. Wenn kein Seed definiert wurde, wird der Standardwert 1 verwendet. Um den Identitätszähler beizubehalten, verwenden Sie DELETE stattdessen.
Löschen aller Zeilen mit DELETE
Das folgende Beispiel löscht alle Zeilen aus der Person-Tabelle:
DELETE FROM Person.Person;
GO
LÖSCHEN entfernt Zeilen einzeln. Der Befehl fügt den neuen Datensatz für jede gelöschte Zeile zum Transaktionsprotokoll hinzu. LÖSCHEN verwendet während der Ausführung eine Zeilensperre, was bedeutet, dass jede Zeile in der Tabelle zum Löschen gesperrt ist. Einmal LÖSCHEN ausgeführt wird, kann eine Tabelle noch leere Datenseiten enthalten. Zum Beispiel können leere Seiten im Heap nicht ohne zumindest eine exklusive (LCK_M_X) Tabellensperre freigegeben werden. LÖSCHEN und TRUNCATE beide können zurückgesetzt werden, wenn sie mit TRANSACTION verwendet werden .
Lesen Sie auch
Unterschied zwischen DELETE- und TRUNCATE-Tabelle in SQL Server