Alle Antworten sind plattformspezifisch. In Standard-SQL gibt es keinen TRUNCATE-Befehl. Es ist daher eine proprietäre Funktion und bedeutet für jeden DBMS-Anbieter etwas anderes.
Nvogel
Die Antwort ist sehr implementierungsspezifisch, wie es sein muss, da dies, wie sqlvogel hervorhob, ein nicht standardmäßiger Befehl (TRUNCATE) ist. Lassen Sie dieses getaggte "Orakel" oder machen Sie es zu einer Antwort im Community-Wiki-Stil und geben Sie die Konsequenzen für jedes wichtige RDBMS (Oracle, MS-MSQL, PostgreSQL implementieren alle TRUNCATE ...) ein
reedstrm
Wenn die Transaktion abgeschlossen ist, bedeutet COMMITED, können wir den Befehl TRUNCATE nicht zurücksetzen, aber den Befehl DELETE aus LOG-Dateien zurücksetzen, da DELETE write sie in der Protokolldatei aufzeichnet, falls sie in Zukunft aus LOG-Dateien zurückgesetzt werden muss.
Antworten:
272
Hier ist eine Liste der Unterschiede. Ich habe Oracle-spezifische Funktionen hervorgehoben, und hoffentlich kann die Community auch den spezifischen Unterschied anderer Anbieter hinzufügen. Unterschiede, die den meisten Anbietern gemeinsam sind, können direkt unter den Überschriften auftreten, wobei die Unterschiede unten hervorgehoben werden.
Gesamtübersicht
Wenn Sie schnell alle Zeilen aus einer Tabelle löschen möchten und wirklich sicher sind, dass Sie dies tun möchten und keine Fremdschlüssel für die Tabellen haben, ist ein TRUNCATE wahrscheinlich schneller als ein DELETE .
Verschiedene systemspezifische Probleme müssen berücksichtigt werden, wie nachstehend beschrieben.
Da ein TRUNCATE DDL ist, sind zwei Commits erforderlich, eines vor und eines nach der Ausführung der Anweisung. Das Abschneiden kann daher nicht rückgängig gemacht werden, und ein Fehler beim Abschneiden hat ohnehin ein Commit ausgelöst.
Siehe jedoch Rückblende unten.
Raumgewinnung
Durch Löschen wird kein Speicherplatz wiederhergestellt, durch Abschneiden wird Speicherplatz wiederhergestellt
Orakel
Wenn Sie die REUSE STORAGE-Klausel verwenden, werden die Datensegmente nicht freigegeben. Dies kann geringfügig effizienter sein, wenn die Tabelle mit Daten neu geladen werden soll. Die Hochwassermarke wird zurückgesetzt.
Zeilenumfang
Mit Löschen können alle Zeilen oder nur eine Teilmenge von Zeilen entfernt werden. Abschneiden entfernt alle Zeilen.
Orakel
Wenn eine Tabelle partitioniert ist, können die einzelnen Partitionen isoliert abgeschnitten werden, sodass alle Daten der Tabelle teilweise entfernt werden können.
Objekttypen
Löschen kann auf Tabellen und Tabellen innerhalb eines Clusters angewendet werden. Abschneiden gilt nur für Tabellen oder den gesamten Cluster. (Kann Oracle-spezifisch sein)
Datenobjektidentität
Orakel
Das Löschen wirkt sich nicht auf die Datenobjekt-ID aus, aber das Abschneiden weist eine neue Datenobjekt-ID zu, es sei denn, seit ihrer Erstellung wurde noch nie eine Einfügung für die Tabelle vorgenommen. Selbst eine einzelne Einfügung, die zurückgesetzt wird, führt dazu, dass beim Abschneiden eine neue Datenobjekt-ID zugewiesen wird .
Rückblende (Oracle)
Rückblende funktioniert über Löschvorgänge hinweg, aber ein Abschneiden verhindert Rückblende in Zustände vor dem Vorgang.
Ab 11gR2 ermöglicht die FLASHBACK ARCHIVE-Funktion dies jedoch, außer in der Express Edition
Das Löschen kann für eine Tabelle einem anderen Benutzer oder einer anderen Rolle gewährt werden, das Abschneiden jedoch nicht ohne die Verwendung einer DROP ANY TABLE-Berechtigung.
Wiederholen rückgängig
Löschen erzeugt eine kleine Menge an Wiederherstellen und eine große Menge an Rückgängigmachen. Abschneiden erzeugt jeweils eine vernachlässigbare Menge.
Indizes
Orakel
Eine Kürzungsoperation macht unbrauchbare Indizes wieder verwendbar. Löschen nicht.
Fremde Schlüssel
Ein Abschneiden kann nicht angewendet werden, wenn ein aktivierter Fremdschlüssel auf die Tabelle verweist. Die Behandlung mit Löschen hängt von der Konfiguration der Fremdschlüssel ab.
Tischsperre
Orakel
Abschneiden erfordert eine exklusive Tabellensperre, Löschen erfordert eine gemeinsame Tabellensperre. Das Deaktivieren von Tabellensperren ist daher eine Möglichkeit, das Abschneiden von Vorgängen für eine Tabelle zu verhindern.
Löst aus
DML-Trigger werden beim Abschneiden nicht ausgelöst.
Orakel
DDL-Trigger sind verfügbar.
Remote-Ausführung
Orakel
Abschneiden kann nicht über eine Datenbankverbindung ausgegeben werden.
Identitätsspalten
SQL Server
Durch Abschneiden wird die Sequenz für IDENTITY-Spaltentypen zurückgesetzt, durch Löschen nicht.
Ergebnismenge
In den meisten Implementierungen a DELETE Anweisung die gelöschten Zeilen an den Client zurückgeben.
Beispiel: In einem Oracle PL / SQL-Unterprogramm können Sie:
DELETEFROM employees_temp
WHERE employee_id =299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
Verstehe deine 4. Aussage nicht: wenn ich DELETE [ ] FROM Table sage ; dann * werden alle Zeilen in dieser Tabelle gelöscht, es sei denn, ein FK stoppt sie. Ich denke, dies ist SQL Server-spezifisch. Sie können TRUNCATE nicht für Tabellen mit FKs verwenden.
Joe Pineda
Noch ein paar Kommentare: Ich bin mit Ihrer dritten Aussage nicht einverstanden, es sei denn, sie ist Oracle-spezifisch. Zumindest mit SQL S. können Sie entweder beim LÖSCHEN oder TRUNCIEREN keinen Speicherplatz wiederherstellen (dh Datenbankdateien werden auf der Festplatte nicht verkleinert), es sei denn, Sie fragen ausdrücklich danach.
Joe Pineda
1
5. Anweisung: Sie können eine TRUNCATE TABLE auf SQL 2008 R2
Eric Labashosky
1
Postgresql kann ein TRUNCATE zurücksetzen und legt es daher auch nicht automatisch fest.
Rfusca
5
DELETE gibt die Anzahl der gelöschten Zeilen zurück, TRUNCATE jedoch nicht. Es ist ein sehr dummer Punkt, aber erwähnenswert :)
Deepak Kumar Jha
191
Der Unterschied zwischen Abschneiden und Löschen ist unten aufgeführt:
+----------------------------------------+----------------------------------------------+
| Truncate | Delete |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing | We can Rollback after delete. |
| Truncate. | |
| | |
| Example: | Example: |
| BEGIN TRAN | BEGIN TRAN |
| TRUNCATE TABLE tranTest | DELETE FROM tranTest |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
| ROLLBACK | ROLLBACK |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table. | Delete does not reset identity of table. |
+----------------------------------------+----------------------------------------------+
| It locks the entire table. | It locks the table row. |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language) | Its DML(Data Manipulation Language) |
| command. | command. |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it. | We can use WHERE to filter data to delete. |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate. | Trigger is fired. |
+----------------------------------------+----------------------------------------------+
| Syntax : | Syntax : |
| 1) TRUNCATE TABLE table_name | 1) DELETE FROM table_name |
| | 2) DELETE FROM table_name WHERE |
| | example_column_id IN (1,2,3) |
+----------------------------------------+----------------------------------------------+
Zurücksetzen der Identität der Tabelle abschneiden Was bedeutet das? Aber was ist mit Löschen?
Ravi
1
@jWeaver: Dies bedeutet, wenn Sie die Eigenschaft Identitätsspezifikation für das Primärschlüsselfeld auf True setzen. Wenn Sie also Daten in diese Tabelle einfügen, enthält die Primärschlüsselspalte den Wert 1,2,3,4,5 .... (wenn die Identität beginnt von 1 und Startwert ist 1), und wenn Sie die Tabelle abschneiden, geht der gesamte Identitätswert verloren. Wenn Sie also erneut Daten in diese Tabelle einfügen, beginnt sie bei 1 und nicht dort, wo sie zuletzt verbleibt. In DELETE ist es umgekehrt, der Identitätswert bleibt auch nach Ausführung der DELETE-Anweisung erhalten. Entschuldigung für den Fehler des 2. Vergleichspunkts in der Spalte LÖSCHEN im obigen Bild.
Bhaumik Patel
Scheint, als würden Sie für SQL Server
Ravi
4
Sowohl TRUNCATE als auch DELETE können in SQL SERVER zurückgerollt werden . Und in der 2. Reihe setzt DELETE die Identität nicht zurück. Wie können Sie diesen Beitrag bearbeiten? Das ist das Schlechte an der Verwendung von Bildern in StackOverflow.
Mahmood Jenami
2
Abschneiden wird zurückgesetzt! (SQL Server)
Aimal Khan
55
FALLEN
Der Befehl DROP entfernt eine Tabelle aus der Datenbank. Alle Zeilen, Indizes und Berechtigungen der Tabellen werden ebenfalls entfernt. Es werden keine DML-Trigger ausgelöst. Der Vorgang kann nicht zurückgesetzt werden.
KÜRZEN
TRUNCATE entfernt alle Zeilen aus einer Tabelle. Der Vorgang kann nicht zurückgesetzt werden und es werden keine Trigger ausgelöst. Daher ist TRUNCATE schneller und benötigt nicht so viel Speicherplatz wie ein DELETE. Beim Abschneiden wird eine Sperre auf Tabellenebene hinzugefügt.
LÖSCHEN
Mit dem Befehl DELETE werden Zeilen aus einer Tabelle entfernt. Eine WHERE-Klausel kann verwendet werden, um nur einige Zeilen zu entfernen. Wenn keine WHERE-Bedingung angegeben ist, werden alle Zeilen entfernt. Nach dem Ausführen eines DELETE-Vorgangs müssen Sie die Transaktion COMMIT oder ROLLBACK ausführen, um die Änderung dauerhaft zu machen oder rückgängig zu machen. Beachten Sie, dass bei diesem Vorgang alle DELETE-Trigger auf dem Tisch ausgelöst werden. Beim Löschen wird eine Sperre auf Zeilenebene hinzugefügt.
Ah, Auslöser ... das ist ein guter Punkt. Ich werde das zu der Liste hinzufügen, die ich gemacht habe, und dir Polara gutschreiben, wenn das in Ordnung ist.
David Aldridge
Mit SQL Server können Sie eine Tabelle mit Fremdschlüsseln nicht abschneiden, sodass Ihr Kaskadierungspunkt je nach Plattform möglicherweise umstritten ist.
Zur Verdeutlichung gilt dies für SQL Server, wenn in der Tabelle eine Spalte als IDENTITY definiert ist. Durch Löschen wird die zuletzt automatisch zugewiesene ID beibehalten, während durch Abschneiden der Zähler zurückgesetzt wird.
Codewerks
Da die Frage mit ORACLE markiert ist, ist diese Antwort FALSCH und wird daher abgelehnt.
Guy
Ups, habe das Orakel-Tag nicht gesehen :)
Mathieu
+1 true und setzt es auf 0 zurück . Wenn Sie möchten, dass es stattdessen 1 ist :DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB
Ich habe dies in die Community-Antwort aufgenommen und es ein bisschen benutzerfreundlicher gemacht, um herstellerspezifische Probleme zu dokumentieren
David Aldridge
12
"Abschneiden protokolliert nichts" ist korrekt. Ich würde weiter gehen:
Abschneiden wird nicht im Kontext einer Transaktion ausgeführt.
Der Geschwindigkeitsvorteil des Abschneidens gegenüber dem Löschen sollte offensichtlich sein. Dieser Vorteil reicht je nach Situation von trivial bis enorm.
Ich habe jedoch gesehen, dass das Abschneiden unbeabsichtigt die referenzielle Integrität verletzt und andere Einschränkungen verletzt. Die Leistung, die Sie durch das Ändern von Daten außerhalb einer Transaktion gewinnen, muss gegen die Verantwortung abgewogen werden, die Sie erben, wenn Sie die Gratwanderung ohne Netz unternehmen.
TRUNCATEist die DDL-Anweisung, während DELETEes sich um eine DML-Anweisung handelt. Nachfolgend sind die Unterschiede zwischen den beiden aufgeführt:
Wie TRUNCATEbei einer DDL- Anweisung ( Data Definition Language ) ist kein Commit erforderlich, um die Änderungen dauerhaft zu machen. Dies ist der Grund, warum durch Abschneiden gelöschte Zeilen nicht zurückgesetzt werden konnten. Auf der anderen Seite erfordert DELETEeine DML- Anweisung ( Data Manipulation Language ) ein explizites Commit, um ihre Wirkung dauerhaft zu machen.
TRUNCATEEntfernt immer alle Zeilen aus einer Tabelle, wobei die Tabelle leer und die Tabellenstruktur intakt DELETEbleibt. Bei Verwendung der where-Klausel kann dies jedoch bedingt entfernt werden.
Die durch die TRUNCATE TABLEAnweisung gelöschten Zeilen können nicht wiederhergestellt werden, und Sie können die where-Klausel in der TRUNCATEAnweisung nicht angeben .
TRUNCATEAussagen feuern nicht Trigger ab auf auf DELETE - Trigger gegen DELETEAussage
Ja, DELETE ist langsamer, TRUNCATE ist schneller. Warum?
DELETE muss die Datensätze lesen, Einschränkungen überprüfen, den Block aktualisieren, Indizes aktualisieren und Wiederherstellen / Rückgängigmachen generieren. All das braucht Zeit.
TRUNCATE passt einfach einen Zeiger in der Datenbank für die Tabelle (die High Water Mark) und den Poof an! Die Daten sind weg.
Die SQL-Abfrage TRUNCATE entfernt alle Zeilen aus einer Tabelle, ohne die einzelnen Zeilenlöschungen zu protokollieren.
TRUNCATE ist ein DDL-Befehl.
TRUNCATE wird mit einer Tabellensperre ausgeführt und die gesamte Tabelle wird gesperrt, um alle Datensätze zu entfernen.
Wir können die WHERE-Klausel nicht mit TRUNCATE verwenden.
TRUNCATE entfernt alle Zeilen aus einer Tabelle.
Minimale Protokollierung im Transaktionsprotokoll, sodass die Leistung schneller ist.
TRUNCATE TABLE entfernt die Daten, indem die zum Speichern der Tabellendaten verwendeten Datenseiten freigegeben werden, und zeichnet nur die Seitenfreigaben im Transaktionsprotokoll auf.
Um Truncate für eine Tabelle verwenden zu können, benötigen Sie mindestens die ALTER-Berechtigung für die Tabelle.
Abschneiden verwendet weniger Transaktionsspeicher als die Delete-Anweisung.
Abschneiden kann nicht mit indizierten Ansichten verwendet werden.
TRUNCATE ist schneller als DELETE.
LÖSCHEN
Um eine DELETE-Warteschlange auszuführen, sind Löschberechtigungen für die Zieltabelle erforderlich. Wenn Sie eine WHERE-Klausel in einem DELETE verwenden müssen, sind auch ausgewählte Berechtigungen erforderlich.
DELETE ist ein DML-Befehl.
DELETE wird mit einer Zeilensperre ausgeführt. Jede Zeile in der Tabelle wird zum Löschen gesperrt.
Wir können die where-Klausel mit DELETE verwenden, um bestimmte Datensätze zu filtern und zu löschen.
Der Befehl DELETE wird verwendet, um Zeilen basierend auf der WHERE-Bedingung aus einer Tabelle zu entfernen.
Das Protokoll wird verwaltet, sodass es langsamer als TRUNCATE ist.
Die DELETE-Anweisung entfernt die Zeilen einzeln und zeichnet für jede gelöschte Zeile einen Eintrag im Transaktionsprotokoll auf.
Identität der Spalte behalten DELETE behält die Identität.
Um Delete verwenden zu können, benötigen Sie die Berechtigung DELETE für die Tabelle.
Löschen verwendet mehr Transaktionsraum als die Anweisung Truncate.
Löschen kann mit indizierten Ansichten verwendet werden.
Wenn Sie versehentlich alle Daten mit Löschen / Abschneiden aus der Tabelle entfernt haben. Sie können festgeschriebene Transaktionen zurücksetzen. Stellen Sie die letzte Sicherung wieder her und führen Sie das Transaktionsprotokoll bis zu dem Zeitpunkt aus, an dem Löschen / Abschneiden bevorsteht.
Während der Arbeit an der Datenbank verwenden wir Löschen und Abschneiden, ohne die Unterschiede zwischen ihnen zu kennen. In diesem Artikel werden wir den Unterschied zwischen Löschen und Abschneiden in SQL diskutieren.
Löschen:
Löschen ist ein DML-Befehl.
Die Delete-Anweisung wird mit einer Zeilensperre ausgeführt. Jede Zeile in der Tabelle wird zum Löschen gesperrt.
Wir können Filter in der where-Klausel angeben.
Es löscht die angegebenen Daten, wenn eine Bedingung vorliegt.
Löschen Sie Aktivitäten als Auslöser, da die Operation einzeln protokolliert wird.
Langsamer als Abschneiden, da Protokolle gespeichert werden
Kürzen
Abschneiden ist ein DDL-Befehl.
Tabelle abschneiden sperrt immer die Tabelle und die Seite, aber nicht jede Zeile. Da alle Daten entfernt werden.
Kann Where-Bedingung nicht verwenden.
Es entfernt alle Daten.
Tabelle abschneiden kann keinen Trigger aktivieren, da der Vorgang keine einzelnen Zeilenlöschungen protokolliert.
Schneller in Bezug auf die Leistung, da keine Protokolle geführt werden.
Hinweis: Löschen und Abschneiden können bei Verwendung mit Transaktion zurückgesetzt werden. Wenn die Transaktion abgeschlossen ist, bedeutet festgeschrieben, dass wir den Befehl "Abschneiden" nicht zurücksetzen können, aber dennoch den Befehl "Löschen" aus Protokolldateien zurücksetzen können, da das Löschen Schreibaufzeichnungen in der Protokolldatei aufzeichnet, falls ein zukünftiges Zurücksetzen aus Protokolldateien erforderlich ist.
Wenn Sie eine Fremdschlüsseleinschränkung haben, die sich auf die Tabelle bezieht, die Sie abschneiden möchten, funktioniert dies auch dann nicht, wenn die verweisende Tabelle keine Daten enthält. Dies liegt daran, dass die Fremdschlüsselprüfung nicht mit DML, sondern mit DDL durchgeführt wird. Dies kann umgangen werden, indem die Fremdschlüsseleinschränkung (en) für die Tabelle vorübergehend deaktiviert werden.
Tabelle löschen ist eine protokollierte Operation. Das Löschen jeder Zeile wird also im Transaktionsprotokoll protokolliert, was es langsam macht. Tabelle abschneiden löscht auch alle Zeilen in einer Tabelle, protokolliert jedoch nicht das Löschen jeder Zeile, sondern die Freigabe der Datenseiten der Tabelle, wodurch sie schneller wird.
~ Wenn Sie versehentlich alle Daten mit Löschen / Abschneiden aus der Tabelle entfernt haben. Sie können festgeschriebene Transaktionen zurücksetzen. Stellen Sie die letzte Sicherung wieder her und führen Sie das Transaktionsprotokoll bis zu dem Zeitpunkt aus, an dem Löschen / Abschneiden bevorsteht.
Mit dem Befehl DELETE werden Zeilen aus einer Tabelle entfernt. Eine WHERE-Klausel kann verwendet werden, um nur einige Zeilen zu entfernen. Wenn keine WHERE-Bedingung angegeben ist, werden alle Zeilen entfernt. Nach dem Ausführen eines DELETE-Vorgangs müssen Sie die Transaktion COMMIT oder ROLLBACK ausführen, um die Änderung dauerhaft zu machen oder rückgängig zu machen. Beachten Sie, dass bei diesem Vorgang alle DELETE-Trigger auf dem Tisch ausgelöst werden.
KÜRZEN
TRUNCATE entfernt alle Zeilen aus einer Tabelle. Der Vorgang kann nicht zurückgesetzt werden und es werden keine Trigger ausgelöst. Daher ist TRUCATE schneller und benötigt nicht so viel Speicherplatz wie ein DELETE.
FALLEN
Der Befehl DROP entfernt eine Tabelle aus der Datenbank. Alle Zeilen, Indizes und Berechtigungen der Tabellen werden ebenfalls entfernt. Es werden keine DML-Trigger ausgelöst. Der Vorgang kann nicht zurückgesetzt werden.
DROP und TRUNCATE sind DDL-Befehle, während DELETE ein DML-Befehl ist. Daher können DELETE-Operationen zurückgesetzt (rückgängig gemacht) werden, während DROP- und TRUNCATE-Operationen nicht zurückgesetzt werden können.
TRUNCATE vs. DELETE ist eine der berüchtigten Fragen bei SQL-Interviews. Stellen Sie einfach sicher, dass Sie es dem Interviewer richtig erklären, da es Sie sonst den Job kosten könnte. Das Problem ist, dass nicht viele wissen, dass sie die Antwort höchstwahrscheinlich als falsch betrachten, wenn Sie ihnen sagen, dass YES Truncate zurückgesetzt werden kann.
Eine kleine Korrektur der ursprünglichen Antwort - Löschen erzeugt auch erhebliche Mengen an Wiederherstellen (da das Rückgängigmachen selbst durch Wiederherstellen geschützt ist). Dies ist aus der Autotrace-Ausgabe ersichtlich:
SQL>deletefrom t1;10918rows deleted.
Elapsed:00:00:00.58
Execution Plan----------------------------------------------------------0DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)10DELETEOF'T1'21TABLE ACCESS (FULL)OF'T1'(TABLE)(Cost=43 Card=1)Statistics----------------------------------------------------------30 recursive calls
12118 db block gets
213 consistent gets
142 physical reads
3975328 redo size
441 bytes sent via SQL*Net to client
537 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)0 sorts (disk)10918rows processed
Sein alter Thread, aber nach meinem Verständnis abgeschnitten, erzeugt nur eine gute Menge an Redo-Log, wobei beim Löschen beide rückgängig gemacht und wiederholt werden.
• Daten entfernen : Als erstes können beide verwendet werden, um die Zeilen aus der Tabelle zu entfernen.
Ein DELETE kann jedoch verwendet werden, um die Zeilen nicht nur aus einer Tabelle, sondern auch aus einer VIEW oder dem Ergebnis eines OPENROWSET oder einer OPENQUERY zu entfernen, sofern die Anbieterfunktionen dies zulassen.
• FROM-Klausel : Mit DELETE können Sie auch Zeilen aus einer Tabelle / view / rowset_function_limited basierend auf Zeilen aus einer anderen Tabelle löschen, indem Sie eine andere FROM-Klausel verwenden. In dieser FROM-Klausel können Sie auch normale JOIN-Bedingungen schreiben. Tatsächlich können Sie eine DELETE-Anweisung aus einer SELECT-Anweisung erstellen, die keine Aggregatfunktionen enthält, indem Sie SELECT durch DELETE ersetzen und Spaltennamen entfernen.
Mit TRUNCATE geht das nicht.
• WO : Ein TRUNCATE kann keine WHERE-Bedingungen haben, ein DELETE jedoch. Das bedeutet, dass Sie mit TRUNCATE keine bestimmte Zeile oder bestimmte Gruppe von Zeilen löschen können. TRUNCATE TABLE ähnelt der DELETE-Anweisung ohne WHERE-Klausel.
• Leistung : TRUNCATE TABLE ist schneller und benötigt weniger System- und Transaktionsprotokollressourcen. Und einer der Gründe sind Sperren, die von beiden Anweisungen verwendet werden. Die DELETE-Anweisung wird mit einer Zeilensperre ausgeführt. Jede Zeile in der Tabelle wird zum Löschen gesperrt. TRUNCATE TABLE sperrt immer die Tabelle und die Seite, jedoch nicht jede Zeile.
• Transaktionsprotokoll : Die Anweisung DELETE entfernt die Zeilen einzeln und nimmt für jede Zeile einzelne Einträge im Transaktionsprotokoll vor.
TRUNCATE TABLE entfernt die Daten, indem die zum Speichern der Tabellendaten verwendeten Datenseiten freigegeben werden, und zeichnet nur die Seitenfreigaben im Transaktionsprotokoll auf.
• Seiten : Nachdem eine DELETE-Anweisung ausgeführt wurde, kann die Tabelle noch leere Seiten enthalten. TRUNCATE entfernt die Daten, indem die zum Speichern der Tabellendaten verwendeten Datenseiten freigegeben werden.
• Trigger : TRUNCATE aktiviert die Lösch-Trigger in der Tabelle nicht. Sie müssen also bei der Verwendung von TRUNCATE sehr vorsichtig sein. Man sollte niemals TRUNCATE verwenden, wenn in der Tabelle ein Löschauslöser definiert ist, um beim Löschen von Zeilen eine automatische Bereinigungs- oder Protokollierungsaktion durchzuführen.
• Identitätsspalte : Wenn die Tabelle mit TRUNCATE eine Identitätsspalte enthält, wird der Zähler für diese Spalte auf den für die Spalte definierten Startwert zurückgesetzt. Wenn kein Startwert definiert wurde, wird der Standardwert 1 verwendet. DELETE setzt den Identitätszähler nicht zurück. Wenn Sie also den Identitätszähler beibehalten möchten, verwenden Sie stattdessen DELETE.
• Replikation : DELETE kann für Tabellen verwendet werden, die für die Transaktionsreplikation oder die Zusammenführungsreplikation verwendet werden.
TRUNCATE kann zwar nicht für die Tabellen verwendet werden, die an der Transaktionsreplikation oder der Zusammenführungsreplikation beteiligt sind.
• Rollback : Die DELETE-Anweisung kann zurückgesetzt werden.
TRUNCATE kann auch zurückgesetzt werden, sofern es in einem TRANSACTION-Block eingeschlossen ist und die Sitzung nicht geschlossen wird. Sobald die Sitzung geschlossen ist, können Sie TRUNCATE nicht mehr zurücksetzen.
• Einschränkungen : Die DELETE-Anweisung kann fehlschlagen, wenn sie einen Trigger verletzt oder versucht, eine Zeile zu entfernen, auf die durch Daten in einer anderen Tabelle mit einer FOREIGN KEY-Einschränkung verwiesen wird. Wenn DELETE mehrere Zeilen entfernt und eine der entfernten Zeilen einen Auslöser oder eine Einschränkung verletzt, wird die Anweisung abgebrochen, ein Fehler zurückgegeben und keine Zeilen entfernt.
Wenn DELETE für View verwendet wird, muss diese View eine aktualisierbare Ansicht sein. TRUNCATE kann nicht für die in der indizierten Ansicht verwendete Tabelle verwendet werden.
TRUNCATE kann nicht für die Tabelle verwendet werden, auf die durch eine FOREIGN KEY-Einschränkung verwiesen wird, es sei denn, eine Tabelle mit einem Fremdschlüssel, der auf sich selbst verweist.
Hallo Mangal - danke für die Antwort, insbesondere für SQL * Server-spezifische Probleme. Denken Sie, Sie könnten diese Punkte in die akzeptierte Antwort des Community-Wikis integrieren?
David Aldridge
Ja sicher, aber wie und wo? Entschuldigung, ich bin neu hier.
Mangal Pardeshi
"Also, wenn Sie den Identitätszähler behalten möchten, verwenden Sie LÖSCHEN" könnten Sie verwendenDECLARE @ai as bigintSET @ai =IDENT_CURRENT('tablename')TRUNCATE TABLE tablenameDBCC checkident('tablename', RESEED, @ai)
mpag
1
Der größte Unterschied besteht darin, dass das Abschneiden nicht protokolliert wird, während das Löschen erfolgt.
Dies bedeutet einfach, dass Sie im Falle eines Datenbankabsturzes die durch Abschneiden bearbeiteten Daten nicht wiederherstellen können, aber mit Löschen können Sie dies.
DELETE-Anweisung: Dieser Befehl löscht nur die Zeilen aus der Tabelle basierend auf der in der where-Klausel angegebenen Bedingung oder löscht alle Zeilen aus der Tabelle, wenn keine Bedingung angegeben ist. Der Speicherplatz für die Tabelle wird jedoch nicht freigegeben.
Die Syntax einer SQL DELETE-Anweisung lautet:
DELETE FROM table_name [WHERE-Bedingung];
TRUNCATE-Anweisung: Mit diesem Befehl werden alle Zeilen aus der Tabelle gelöscht und der Speicherplatz für die Tabelle freigegeben.
DELETEis a DML command
DELETE you can rollbackDelete= Only Delete- so it can be rolled back
InDELETE you can write conditions usingWHERE clause
Syntax –Deletefrom[Table]where[Condition]
KÜRZEN
TRUNCATEis a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause)inTRUNCATE
Syntax –Truncatetable[Table]
Ein weiterer Unterschied der beiden Operationen besteht darin, dass, wenn die Tabelle eine Identitätsspalte enthält, der Zähler für diese Spalte unter TRUNCATE auf 1 (oder auf den für die Spalte definierten Startwert) zurückgesetzt wird. DELETE hat diesen Effekt nicht.
Kurz gesagt, das Abschneiden protokolliert nichts (ist also viel schneller, kann aber nicht rückgängig gemacht werden), während das Löschen protokolliert wird (und Teil einer größeren Transaktion sein kann, ein Rollback durchführt usw.). Wenn Sie Daten haben, die Sie nicht in einer Tabelle in dev haben möchten, ist es normalerweise besser, sie abzuschneiden, da Sie nicht das Risiko eingehen, das Transaktionsprotokoll zu füllen
Ein wichtiger Grund dafür ist, dass Sie die Daten in einer Tabelle mit mehreren Millionen Zeilen aktualisieren müssen, sie aber nicht neu erstellen möchten. "Löschen *" würde ewig dauern, während die Auswirkungen von Truncate auf die Leistung vernachlässigbar wären.
Es ist nicht so, dass das Abschneiden in SQL Server nichts protokolliert. truncate protokolliert keine Informationen, protokolliert jedoch die Freigabe der Datenseite für die Tabelle, für die Sie TRUNCATE ausgelöst haben.
und abgeschnittener Datensatz kann ein Rollback sein, wenn wir die Transaktion zu Beginn definieren, und wir können den abgeschnittenen Datensatz nach dem Rollback wiederherstellen. Es können jedoch keine abgeschnittenen Datensätze aus der Transaktionsprotokollsicherung nach einer festgeschriebenen abgeschnittenen Transaktion wiederhergestellt werden.
Abschneiden und Löschen in SQL sind zwei Befehle, mit denen Daten aus der Tabelle entfernt oder gelöscht werden. Obwohl beide SQL-Befehle von Natur aus recht einfach sind, können sie viele Probleme verursachen, bis Sie mit den Details vertraut sind, bevor Sie sie verwenden. Eine falsche Befehlswahl kann entweder zu einem sehr langsamen Prozess führen oder sogar das Protokollsegment in die Luft jagen, wenn zu viele Daten entfernt werden müssen und das Protokollsegment nicht ausreicht. Aus diesem Grund ist es wichtig zu wissen, wann der Befehl zum Abschneiden und Löschen in SQL verwendet werden muss. Bevor Sie diese verwenden, sollten Sie sich jedoch der Unterschiede zwischen Abschneiden und Löschen bewusst sein. Auf der Grundlage dieser Befehle sollten wir herausfinden können, wann DELETE die bessere Option zum Entfernen ist data oder TRUNCATE sollten zum Löschen von Tabellen verwendet werden.
Durch die Ausgabe einer TRUNCATE TABLE-Anweisung weisen Sie SQL Server an, jeden Datensatz in einer Tabelle zu löschen, ohne dass eine Protokollierung oder Transaktionsverarbeitung stattfindet.
Die DELETE-Anweisung kann eine WHERE-Klausel zum Löschen bestimmter Datensätze enthalten, während die TRUNCATE-Anweisung keine benötigt und die gesamte Tabelle löscht. Wichtig ist, dass die DELETE-Anweisung das gelöschte Datum protokolliert, die TRUNCATE-Anweisung jedoch nicht.
Ein weiterer Unterschied, der für Microsoft SQL Server spezifisch ist, besteht darin, dass deleteSie mithilfe der outputAnweisung verfolgen können, welche Datensätze gelöscht wurden, z.
Antworten:
Hier ist eine Liste der Unterschiede. Ich habe Oracle-spezifische Funktionen hervorgehoben, und hoffentlich kann die Community auch den spezifischen Unterschied anderer Anbieter hinzufügen. Unterschiede, die den meisten Anbietern gemeinsam sind, können direkt unter den Überschriften auftreten, wobei die Unterschiede unten hervorgehoben werden.
Gesamtübersicht
Wenn Sie schnell alle Zeilen aus einer Tabelle löschen möchten und wirklich sicher sind, dass Sie dies tun möchten und keine Fremdschlüssel für die Tabellen haben, ist ein TRUNCATE wahrscheinlich schneller als ein DELETE .
Verschiedene systemspezifische Probleme müssen berücksichtigt werden, wie nachstehend beschrieben.
Anweisungstyp
Löschen ist DML, Abschneiden ist DDL ( Was ist DDL und DML? )
Commit und Rollback
Variabel nach Anbieter
SQL Server
Abschneiden kann zurückgesetzt werden.
PostgreSQL
Abschneiden kann zurückgesetzt werden.
Orakel
Da ein TRUNCATE DDL ist, sind zwei Commits erforderlich, eines vor und eines nach der Ausführung der Anweisung. Das Abschneiden kann daher nicht rückgängig gemacht werden, und ein Fehler beim Abschneiden hat ohnehin ein Commit ausgelöst.
Siehe jedoch Rückblende unten.
Raumgewinnung
Durch Löschen wird kein Speicherplatz wiederhergestellt, durch Abschneiden wird Speicherplatz wiederhergestellt
Orakel
Wenn Sie die REUSE STORAGE-Klausel verwenden, werden die Datensegmente nicht freigegeben. Dies kann geringfügig effizienter sein, wenn die Tabelle mit Daten neu geladen werden soll. Die Hochwassermarke wird zurückgesetzt.
Zeilenumfang
Mit Löschen können alle Zeilen oder nur eine Teilmenge von Zeilen entfernt werden. Abschneiden entfernt alle Zeilen.
Orakel
Wenn eine Tabelle partitioniert ist, können die einzelnen Partitionen isoliert abgeschnitten werden, sodass alle Daten der Tabelle teilweise entfernt werden können.
Objekttypen
Löschen kann auf Tabellen und Tabellen innerhalb eines Clusters angewendet werden. Abschneiden gilt nur für Tabellen oder den gesamten Cluster. (Kann Oracle-spezifisch sein)
Datenobjektidentität
Orakel
Das Löschen wirkt sich nicht auf die Datenobjekt-ID aus, aber das Abschneiden weist eine neue Datenobjekt-ID zu, es sei denn, seit ihrer Erstellung wurde noch nie eine Einfügung für die Tabelle vorgenommen. Selbst eine einzelne Einfügung, die zurückgesetzt wird, führt dazu, dass beim Abschneiden eine neue Datenobjekt-ID zugewiesen wird .
Rückblende (Oracle)
Rückblende funktioniert über Löschvorgänge hinweg, aber ein Abschneiden verhindert Rückblende in Zustände vor dem Vorgang.
Ab 11gR2 ermöglicht die FLASHBACK ARCHIVE-Funktion dies jedoch, außer in der Express Edition
Verwendung von FLASHBACK in Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
Privilegien
Variable
Orakel
Das Löschen kann für eine Tabelle einem anderen Benutzer oder einer anderen Rolle gewährt werden, das Abschneiden jedoch nicht ohne die Verwendung einer DROP ANY TABLE-Berechtigung.
Wiederholen rückgängig
Löschen erzeugt eine kleine Menge an Wiederherstellen und eine große Menge an Rückgängigmachen. Abschneiden erzeugt jeweils eine vernachlässigbare Menge.
Indizes
Orakel
Eine Kürzungsoperation macht unbrauchbare Indizes wieder verwendbar. Löschen nicht.
Fremde Schlüssel
Ein Abschneiden kann nicht angewendet werden, wenn ein aktivierter Fremdschlüssel auf die Tabelle verweist. Die Behandlung mit Löschen hängt von der Konfiguration der Fremdschlüssel ab.
Tischsperre
Orakel
Abschneiden erfordert eine exklusive Tabellensperre, Löschen erfordert eine gemeinsame Tabellensperre. Das Deaktivieren von Tabellensperren ist daher eine Möglichkeit, das Abschneiden von Vorgängen für eine Tabelle zu verhindern.
Löst aus
DML-Trigger werden beim Abschneiden nicht ausgelöst.
Orakel
DDL-Trigger sind verfügbar.
Remote-Ausführung
Orakel
Abschneiden kann nicht über eine Datenbankverbindung ausgegeben werden.
Identitätsspalten
SQL Server
Durch Abschneiden wird die Sequenz für IDENTITY-Spaltentypen zurückgesetzt, durch Löschen nicht.
Ergebnismenge
In den meisten Implementierungen a
DELETE
Anweisung die gelöschten Zeilen an den Client zurückgeben.Beispiel: In einem Oracle PL / SQL-Unterprogramm können Sie:
quelle
Der Unterschied zwischen Abschneiden und Löschen ist unten aufgeführt:
quelle
Von: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
quelle
Alle guten Antworten, zu denen ich hinzufügen muss:
Da
TRUNCATE TABLE
es sich um eine DDL ( Data Defination Language ) und nicht um einen DML- Befehl ( Data Manipulation Langauge ) handelt, werdenDelete Triggers
diese nicht ausgeführt.quelle
Zusammenfassung von Löschen gegen Abschneiden in SQL Server
Für einen vollständigen Artikel folgen Sie diesem Link: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Entnommen aus dem Dotnet-Mob-Artikel: Löschen gegen Abschneiden in SQL Server
quelle
Wenn bei SQL Server oder MySQL eine PK mit automatischer Inkrementierung vorhanden ist, wird durch Abschneiden der Zähler zurückgesetzt.
quelle
DBCC CHECKIDENT (table_name, RESEED, 1)
"Abschneiden protokolliert nichts" ist korrekt. Ich würde weiter gehen:
Abschneiden wird nicht im Kontext einer Transaktion ausgeführt.
Der Geschwindigkeitsvorteil des Abschneidens gegenüber dem Löschen sollte offensichtlich sein. Dieser Vorteil reicht je nach Situation von trivial bis enorm.
Ich habe jedoch gesehen, dass das Abschneiden unbeabsichtigt die referenzielle Integrität verletzt und andere Einschränkungen verletzt. Die Leistung, die Sie durch das Ändern von Daten außerhalb einer Transaktion gewinnen, muss gegen die Verantwortung abgewogen werden, die Sie erben, wenn Sie die Gratwanderung ohne Netz unternehmen.
quelle
TRUNCATE
ist die DDL-Anweisung, währendDELETE
es sich um eine DML-Anweisung handelt. Nachfolgend sind die Unterschiede zwischen den beiden aufgeführt:Wie
TRUNCATE
bei einer DDL- Anweisung ( Data Definition Language ) ist kein Commit erforderlich, um die Änderungen dauerhaft zu machen. Dies ist der Grund, warum durch Abschneiden gelöschte Zeilen nicht zurückgesetzt werden konnten. Auf der anderen Seite erfordertDELETE
eine DML- Anweisung ( Data Manipulation Language ) ein explizites Commit, um ihre Wirkung dauerhaft zu machen.TRUNCATE
Entfernt immer alle Zeilen aus einer Tabelle, wobei die Tabelle leer und die Tabellenstruktur intaktDELETE
bleibt. Bei Verwendung der where-Klausel kann dies jedoch bedingt entfernt werden.Die durch die
TRUNCATE TABLE
Anweisung gelöschten Zeilen können nicht wiederhergestellt werden, und Sie können die where-Klausel in derTRUNCATE
Anweisung nicht angeben .TRUNCATE
Aussagen feuern nicht Trigger ab auf auf DELETE - Trigger gegenDELETE
AussageHier ist der sehr gute Link zum Thema relevant.
quelle
Ja, DELETE ist langsamer, TRUNCATE ist schneller. Warum?
DELETE muss die Datensätze lesen, Einschränkungen überprüfen, den Block aktualisieren, Indizes aktualisieren und Wiederherstellen / Rückgängigmachen generieren. All das braucht Zeit.
TRUNCATE passt einfach einen Zeiger in der Datenbank für die Tabelle (die High Water Mark) und den Poof an! Die Daten sind weg.
Dies ist Oracle-spezifisch, AFAIK.
quelle
KÜRZEN
Die SQL-Abfrage TRUNCATE entfernt alle Zeilen aus einer Tabelle, ohne die einzelnen Zeilenlöschungen zu protokollieren.
LÖSCHEN
Um eine DELETE-Warteschlange auszuführen, sind Löschberechtigungen für die Zieltabelle erforderlich. Wenn Sie eine WHERE-Klausel in einem DELETE verwenden müssen, sind auch ausgewählte Berechtigungen erforderlich.
quelle
Wenn Sie versehentlich alle Daten mit Löschen / Abschneiden aus der Tabelle entfernt haben. Sie können festgeschriebene Transaktionen zurücksetzen. Stellen Sie die letzte Sicherung wieder her und führen Sie das Transaktionsprotokoll bis zu dem Zeitpunkt aus, an dem Löschen / Abschneiden bevorsteht.
Die folgenden verwandten Informationen stammen aus einem Blog-Beitrag :
quelle
In SQL Server 2005 Ich glaube , dass Sie kann eine truncate Rollback
quelle
Von: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
quelle
TRUNCATE kann zurückgesetzt werden, wenn es in eine Transaktion eingeschlossen ist.
Bitte beachten Sie die beiden folgenden Referenzen und testen Sie sich selbst: -
http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/
http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx
TRUNCATE vs. DELETE ist eine der berüchtigten Fragen bei SQL-Interviews. Stellen Sie einfach sicher, dass Sie es dem Interviewer richtig erklären, da es Sie sonst den Job kosten könnte. Das Problem ist, dass nicht viele wissen, dass sie die Antwort höchstwahrscheinlich als falsch betrachten, wenn Sie ihnen sagen, dass YES Truncate zurückgesetzt werden kann.
quelle
Eine kleine Korrektur der ursprünglichen Antwort - Löschen erzeugt auch erhebliche Mengen an Wiederherstellen (da das Rückgängigmachen selbst durch Wiederherstellen geschützt ist). Dies ist aus der Autotrace-Ausgabe ersichtlich:
quelle
Hier ist meine detaillierte Antwort zum Unterschied zwischen DELETE und TRUNCATE in SQL Server
• Daten entfernen : Als erstes können beide verwendet werden, um die Zeilen aus der Tabelle zu entfernen.
Ein DELETE kann jedoch verwendet werden, um die Zeilen nicht nur aus einer Tabelle, sondern auch aus einer VIEW oder dem Ergebnis eines OPENROWSET oder einer OPENQUERY zu entfernen, sofern die Anbieterfunktionen dies zulassen.
• FROM-Klausel : Mit DELETE können Sie auch Zeilen aus einer Tabelle / view / rowset_function_limited basierend auf Zeilen aus einer anderen Tabelle löschen, indem Sie eine andere FROM-Klausel verwenden. In dieser FROM-Klausel können Sie auch normale JOIN-Bedingungen schreiben. Tatsächlich können Sie eine DELETE-Anweisung aus einer SELECT-Anweisung erstellen, die keine Aggregatfunktionen enthält, indem Sie SELECT durch DELETE ersetzen und Spaltennamen entfernen.
Mit TRUNCATE geht das nicht.
• WO : Ein TRUNCATE kann keine WHERE-Bedingungen haben, ein DELETE jedoch. Das bedeutet, dass Sie mit TRUNCATE keine bestimmte Zeile oder bestimmte Gruppe von Zeilen löschen können. TRUNCATE TABLE ähnelt der DELETE-Anweisung ohne WHERE-Klausel.
• Leistung : TRUNCATE TABLE ist schneller und benötigt weniger System- und Transaktionsprotokollressourcen. Und einer der Gründe sind Sperren, die von beiden Anweisungen verwendet werden. Die DELETE-Anweisung wird mit einer Zeilensperre ausgeführt. Jede Zeile in der Tabelle wird zum Löschen gesperrt. TRUNCATE TABLE sperrt immer die Tabelle und die Seite, jedoch nicht jede Zeile.
• Transaktionsprotokoll : Die Anweisung DELETE entfernt die Zeilen einzeln und nimmt für jede Zeile einzelne Einträge im Transaktionsprotokoll vor.
TRUNCATE TABLE entfernt die Daten, indem die zum Speichern der Tabellendaten verwendeten Datenseiten freigegeben werden, und zeichnet nur die Seitenfreigaben im Transaktionsprotokoll auf.
• Seiten : Nachdem eine DELETE-Anweisung ausgeführt wurde, kann die Tabelle noch leere Seiten enthalten. TRUNCATE entfernt die Daten, indem die zum Speichern der Tabellendaten verwendeten Datenseiten freigegeben werden.
• Trigger : TRUNCATE aktiviert die Lösch-Trigger in der Tabelle nicht. Sie müssen also bei der Verwendung von TRUNCATE sehr vorsichtig sein. Man sollte niemals TRUNCATE verwenden, wenn in der Tabelle ein Löschauslöser definiert ist, um beim Löschen von Zeilen eine automatische Bereinigungs- oder Protokollierungsaktion durchzuführen.
• Identitätsspalte : Wenn die Tabelle mit TRUNCATE eine Identitätsspalte enthält, wird der Zähler für diese Spalte auf den für die Spalte definierten Startwert zurückgesetzt. Wenn kein Startwert definiert wurde, wird der Standardwert 1 verwendet. DELETE setzt den Identitätszähler nicht zurück. Wenn Sie also den Identitätszähler beibehalten möchten, verwenden Sie stattdessen DELETE.
• Replikation : DELETE kann für Tabellen verwendet werden, die für die Transaktionsreplikation oder die Zusammenführungsreplikation verwendet werden.
TRUNCATE kann zwar nicht für die Tabellen verwendet werden, die an der Transaktionsreplikation oder der Zusammenführungsreplikation beteiligt sind.
• Rollback : Die DELETE-Anweisung kann zurückgesetzt werden.
TRUNCATE kann auch zurückgesetzt werden, sofern es in einem TRANSACTION-Block eingeschlossen ist und die Sitzung nicht geschlossen wird. Sobald die Sitzung geschlossen ist, können Sie TRUNCATE nicht mehr zurücksetzen.
• Einschränkungen : Die DELETE-Anweisung kann fehlschlagen, wenn sie einen Trigger verletzt oder versucht, eine Zeile zu entfernen, auf die durch Daten in einer anderen Tabelle mit einer FOREIGN KEY-Einschränkung verwiesen wird. Wenn DELETE mehrere Zeilen entfernt und eine der entfernten Zeilen einen Auslöser oder eine Einschränkung verletzt, wird die Anweisung abgebrochen, ein Fehler zurückgegeben und keine Zeilen entfernt.
Wenn DELETE für View verwendet wird, muss diese View eine aktualisierbare Ansicht sein. TRUNCATE kann nicht für die in der indizierten Ansicht verwendete Tabelle verwendet werden.
TRUNCATE kann nicht für die Tabelle verwendet werden, auf die durch eine FOREIGN KEY-Einschränkung verwiesen wird, es sei denn, eine Tabelle mit einem Fremdschlüssel, der auf sich selbst verweist.
quelle
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
Der größte Unterschied besteht darin, dass das Abschneiden nicht protokolliert wird, während das Löschen erfolgt.
Dies bedeutet einfach, dass Sie im Falle eines Datenbankabsturzes die durch Abschneiden bearbeiteten Daten nicht wiederherstellen können, aber mit Löschen können Sie dies.
Weitere Details hier
quelle
DELETE-Anweisung: Dieser Befehl löscht nur die Zeilen aus der Tabelle basierend auf der in der where-Klausel angegebenen Bedingung oder löscht alle Zeilen aus der Tabelle, wenn keine Bedingung angegeben ist. Der Speicherplatz für die Tabelle wird jedoch nicht freigegeben.
Die Syntax einer SQL DELETE-Anweisung lautet:
DELETE FROM table_name [WHERE-Bedingung];
TRUNCATE-Anweisung: Mit diesem Befehl werden alle Zeilen aus der Tabelle gelöscht und der Speicherplatz für die Tabelle freigegeben.
quelle
LÖSCHEN
KÜRZEN
Weitere Details finden Sie unter
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
quelle
Ein weiterer Unterschied der beiden Operationen besteht darin, dass, wenn die Tabelle eine Identitätsspalte enthält, der Zähler für diese Spalte unter TRUNCATE auf 1 (oder auf den für die Spalte definierten Startwert) zurückgesetzt wird. DELETE hat diesen Effekt nicht.
quelle
Kurz gesagt, das Abschneiden protokolliert nichts (ist also viel schneller, kann aber nicht rückgängig gemacht werden), während das Löschen protokolliert wird (und Teil einer größeren Transaktion sein kann, ein Rollback durchführt usw.). Wenn Sie Daten haben, die Sie nicht in einer Tabelle in dev haben möchten, ist es normalerweise besser, sie abzuschneiden, da Sie nicht das Risiko eingehen, das Transaktionsprotokoll zu füllen
quelle
Ein wichtiger Grund dafür ist, dass Sie die Daten in einer Tabelle mit mehreren Millionen Zeilen aktualisieren müssen, sie aber nicht neu erstellen möchten. "Löschen *" würde ewig dauern, während die Auswirkungen von Truncate auf die Leistung vernachlässigbar wären.
quelle
DDL kann nicht über einen Dblink ausgeführt werden.
quelle
Ich würde den Beitrag von matthieu kommentieren, aber ich habe noch keinen Repräsentanten ...
In MySQL wird der automatische Inkrementzähler beim Abschneiden zurückgesetzt, nicht jedoch beim Löschen.
quelle
Es ist nicht so, dass das Abschneiden in SQL Server nichts protokolliert. truncate protokolliert keine Informationen, protokolliert jedoch die Freigabe der Datenseite für die Tabelle, für die Sie TRUNCATE ausgelöst haben.
und abgeschnittener Datensatz kann ein Rollback sein, wenn wir die Transaktion zu Beginn definieren, und wir können den abgeschnittenen Datensatz nach dem Rollback wiederherstellen. Es können jedoch keine abgeschnittenen Datensätze aus der Transaktionsprotokollsicherung nach einer festgeschriebenen abgeschnittenen Transaktion wiederhergestellt werden.
quelle
Abschneiden kann hier auch das Beispiel zurückgesetzt werden
quelle
Abschneiden und Löschen in SQL sind zwei Befehle, mit denen Daten aus der Tabelle entfernt oder gelöscht werden. Obwohl beide SQL-Befehle von Natur aus recht einfach sind, können sie viele Probleme verursachen, bis Sie mit den Details vertraut sind, bevor Sie sie verwenden. Eine falsche Befehlswahl kann entweder zu einem sehr langsamen Prozess führen oder sogar das Protokollsegment in die Luft jagen, wenn zu viele Daten entfernt werden müssen und das Protokollsegment nicht ausreicht. Aus diesem Grund ist es wichtig zu wissen, wann der Befehl zum Abschneiden und Löschen in SQL verwendet werden muss. Bevor Sie diese verwenden, sollten Sie sich jedoch der Unterschiede zwischen Abschneiden und Löschen bewusst sein. Auf der Grundlage dieser Befehle sollten wir herausfinden können, wann DELETE die bessere Option zum Entfernen ist data oder TRUNCATE sollten zum Löschen von Tabellen verwendet werden.
Siehe Check hier klicken
quelle
Durch die Ausgabe einer TRUNCATE TABLE-Anweisung weisen Sie SQL Server an, jeden Datensatz in einer Tabelle zu löschen, ohne dass eine Protokollierung oder Transaktionsverarbeitung stattfindet.
quelle
Die DELETE-Anweisung kann eine WHERE-Klausel zum Löschen bestimmter Datensätze enthalten, während die TRUNCATE-Anweisung keine benötigt und die gesamte Tabelle löscht. Wichtig ist, dass die DELETE-Anweisung das gelöschte Datum protokolliert, die TRUNCATE-Anweisung jedoch nicht.
quelle
Ein weiterer Unterschied, der für Microsoft SQL Server spezifisch ist, besteht darin, dass
delete
Sie mithilfe deroutput
Anweisung verfolgen können, welche Datensätze gelöscht wurden, z.Sie können dies nicht mit tun
truncate
.quelle