Was ist der Unterschied zwischen TRUNCATE und DELETE in SQL?


303

Was ist der Unterschied zwischen TRUNCATEund DELETEin SQL?

Wenn Ihre Antwort plattformspezifisch ist, geben Sie dies bitte an.


4
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.


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:

DELETE FROM 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.

Von: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


5
Schöne Erklärung für einen Anfänger wie mich
Vikas Kukreti

Kurz und bündig
ABH

23

Alle guten Antworten, zu denen ich hinzufügen muss:

Da TRUNCATE TABLEes sich um eine DDL ( Data Defination Language ) und nicht um einen DML- Befehl ( Data Manipulation Langauge ) handelt, werden Delete Triggersdiese nicht ausgeführt.


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.
Meff

PostgreSQL hat einen "TRUNCATE Trigger"
a_horse_with_no_name


17

Wenn bei SQL Server oder MySQL eine PK mit automatischer Inkrementierung vorhanden ist, wird durch Abschneiden der Zähler zurückgesetzt.


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.


7

TRUNCATEist die DDL-Anweisung, während DELETEes sich um eine DML-Anweisung handelt. Nachfolgend sind die Unterschiede zwischen den beiden aufgeführt:

  1. 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.

  2. 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.

  3. 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 .

  4. TRUNCATEAussagen feuern nicht Trigger ab auf auf DELETE - Trigger gegen DELETEAussage

Hier ist der sehr gute Link zum Thema relevant.


6

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.


PostgreSQL ähnelt dem ebenfalls.
Gavin M. Roy

6

KÜRZEN

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.

5

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 :

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.


1
Danke @Lucas: Er hat den Inhalt eingefügt. Ich habe es nur in ein Blockzitat gesetzt, um zu verdeutlichen, dass es aus einer anderen Quelle stammt.
AstroCB

4

In SQL Server 2005 Ich glaube , dass Sie kann eine truncate Rollback


4

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.

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.

Von: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


Fügt dies den aktuellen Antworten etwas hinzu?
David Aldridge

3

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.


2

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> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE 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)
      10918  rows 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.
Saurabh Sinha

2

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.


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 bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC 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.

Weitere Details hier


1

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.


1

LÖSCHEN

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax  Delete from [Table] where [Condition]

KÜRZEN

TRUNCATE is 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) in TRUNCATE
Syntax  Truncate table [Table]

Weitere Details finden Sie unter

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/


1

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.


0

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


0

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.


0

DDL kann nicht über einen Dblink ausgeführt werden.


0

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.


0

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.


0

Abschneiden kann hier auch das Beispiel zurückgesetzt werden

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

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


0

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.


0

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.


0

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.

delete from [SomeTable]
output deleted.Id, deleted.Name

Sie können dies nicht mit tun truncate.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.