Unterschied zwischen Drop-Tabelle und abgeschnittener Tabelle?


80

Ich habe einige Tabellen, die ich als Teil meines Berichts-Rollups erstellt habe. Ich brauche sie danach überhaupt nicht mehr. Jemand erwähnte, sie abzuschneiden, da es schneller wäre.


2
Sie können Antwort von stackoverflow.com/questions/2012974/…
php

Wenn Sie die Tabelle abschneiden, gibt MySQL den Speicherplatz auf der Festplatte nicht frei. Wenn Sie Ihren Speicher zurückhaben möchten, sollten Sie die Tabelle löschen, ohne sie abzuschneiden.
Emilio Nicolás

Antworten:


102

Das Löschen von Datensätzen aus einer Tabelle protokolliert jedes Löschen und führt Löschauslöser für die gelöschten Datensätze aus. Abschneiden ist ein leistungsfähigerer Befehl, der eine Tabelle leert, ohne jede Zeile zu protokollieren. SQL Server verhindert, dass Sie eine Tabelle mit Fremdschlüsseln abschneiden, die darauf verweisen, da die Fremdschlüssel in jeder Zeile überprüft werden müssen.

Das Abschneiden ist normalerweise ultraschnell und ideal zum Bereinigen von Daten aus einer temporären Tabelle. Die Struktur der Tabelle bleibt für die zukünftige Verwendung erhalten.

Wenn Sie tatsächlich die Tabelle entfernen möchten Definitionen sowie die Daten, fallen einfach die Tabellen.

Weitere Informationen finden Sie in diesem MSDN-Artikel


4
Durch das Abschneiden einer Tabelle wird auch der Identitätsstart zurückgesetzt. Dies kann beim Testen hilfreich sein, da Sie Ihre Tabelle abschneiden und Daten einfügen können und jedes Mal wissen, wie die Identitätswerte aussehen werden. Sie können dies tun, wenn Sie gerade alle Daten in der Tabelle gelöscht haben.
Jim


87

DROP TABLE löscht die Tabelle.

TRUNCATE TABLE leert es, lässt aber seine Struktur für zukünftige Daten.


4
Mann, da steckt noch viel mehr dahinter;)
David Aldridge

21
Dies ist der Hauptunterschied.
Ceejayoz

26

DROP und TRUNC machen verschiedene Dinge:

TRUNCATE TABLE

Entfernt alle Zeilen aus einer Tabelle, ohne die einzelnen Zeilenlöschungen zu protokollieren. TRUNCATE TABLE ähnelt der DELETE-Anweisung ohne WHERE-Klausel. TRUNCATE TABLE ist jedoch schneller und benötigt weniger System- und Transaktionsprotokollressourcen.

TROPFENTABELLE

Entfernt eine oder mehrere Tabellendefinitionen und alle Daten, Indizes, Trigger, Einschränkungen und Berechtigungsspezifikationen für diese Tabellen.

In Bezug auf die Geschwindigkeit sollte der Unterschied gering sein. Und wenn Sie die Tabellenstruktur überhaupt nicht benötigen, verwenden Sie auf jeden Fall DROP.


20

Ich denke, Sie meinen den Unterschied zwischen DELETE TABLE und TRUNCATE TABLE.

TROPFENTABELLE

Entfernen Sie die Tabelle aus der Datenbank.

TABELLE LÖSCHEN

ohne Bedingung alle Zeilen löschen. Wenn Trigger und Referenzen vorhanden sind, wird dies für jede Zeile verarbeitet. Auch ein Index wird geändert, wenn es einen gibt.

TRUNCATE TABLE

Setzen Sie die Zeilenanzahl auf Null und ohne jede Zeile zu protokollieren. Dass es viel schneller ist als die beiden anderen.


4
set the row count zeroDer Identitätswert wird tatsächlich auf den ursprünglichen Identitätsstartwert zurückgesetzt.
Filip De Vos

11

Keine dieser Antworten weist auf einen wichtigen Unterschied zwischen diesen beiden Operationen hin. Drop Table ist eine Operation, die zurückgesetzt werden kann. Das Abschneiden kann jedoch nicht zurückgesetzt werden ['TRUNCATE TABLE' kann ebenfalls zurückgesetzt werden]. Auf diese Weise kann das Löschen einer sehr großen Tabelle sehr teuer sein, wenn viele Zeilen vorhanden sind, da alle in einem temporären Bereich aufgezeichnet werden müssen, falls Sie sie zurücksetzen möchten.

Wenn ich eine große Tabelle loswerden möchte, schneide ich sie normalerweise ab und lasse sie dann fallen. Auf diese Weise werden die Daten ohne Datensatz gelöscht, und die Tabelle kann gelöscht werden. Dieser Löschvorgang ist sehr kostengünstig, da keine Daten aufgezeichnet werden müssen.

Es ist jedoch wichtig darauf hinzuweisen, dass beim Abschneiden nur Daten gelöscht werden und die Tabelle verlassen wird, während beim Löschen die Daten und die Tabelle selbst gelöscht werden. (vorausgesetzt, Fremdschlüssel schließen eine solche Aktion nicht aus)


2
Dies ist nicht vollständig korrekt. TRUNCATE kann im Sinne von BEGIN TRANSACTION, TRUNCATE TABLE, ROLLBACK zurückgesetzt werden, nur nicht im Sinne von "Transaktionsprotokolle wiederherstellen". Es protokolliert die Freigabe der Seiten.
Mark Sowul

1
-1 DROPist im Grunde nur ein TRUNCATEgefolgt vom Löschen von Tabellenmetadaten aus den Systemtabellen. Sehen Sie diese Frage hier
Martin Smith

5

DROP-Tabelle

DROP TABLE [table_name];

Mit dem Befehl DROP wird eine Tabelle aus der Datenbank entfernt. Es ist ein DDL-Befehl. Alle Zeilen, Indizes und Berechtigungen der Tabelle werden ebenfalls entfernt. Der DROP-Vorgang kann nicht zurückgesetzt werden.

Tabelle LÖSCHEN

DELETE FROM [table_name]
WHERE [condition];

DELETE FROM [table_name];

Der Befehl DELETE ist ein DML-Befehl. Es kann verwendet werden, um alle Zeilen oder einige Zeilen aus der Tabelle zu löschen, basierend auf der in der WHERE-Klausel angegebenen Bedingung. Es wird mit einer Zeilensperre ausgeführt. Jede Zeile in der Tabelle wird zum Löschen gesperrt. Das Transaktionsprotokoll wird verwaltet, sodass es langsamer als TRUNCATE ist. DELETE-Vorgänge können zurückgesetzt werden.

TRUNCATE-Tabelle

TRUNCATE TABLE [table_name];

Der Befehl TRUNCATE entfernt alle Zeilen aus einer Tabelle. Es wird nicht das Löschen jeder Zeile protokolliert, sondern die Freigabe der Datenseiten der Tabelle, wodurch sie schneller als LÖSCHEN ist. Es wird mit einer Tabellensperre ausgeführt und die gesamte Tabelle wird gesperrt, um alle Datensätze zu entfernen. Es ist ein DDL-Befehl. TRUNCATE-Vorgänge können nicht zurückgesetzt werden.


Das ist nicht richtig. Truncate and Drop kann zurückgesetzt werden. TABELLE ERSTELLEN dbo.TestTruncate (ID INT) INSERT IN dbo.TestTruncate (ID) VALUES (1) INSERT INTO dbo.TestTruncate (ID) VALUES (2) INSERT IN dbo.TestTruncate (ID) VALUES (3) BEGIN TRAN TRUNC .TestTruncate DROP TABLE dbo.TestTruncate ROLLBACK SELECT * FROM dbo.TestTruncate DROP TABLE dbo.TestTruncate
Zwischen den

4

TRUNCATE TABLE behält Ihre gesamte alte Indizierung und so weiter. DROP TABLE würde die Tabelle natürlich entfernen und Sie müssen sie später neu erstellen.


3

Drop entfernt die Tabelle vollständig und entfernt auch die Definition. Durch Abschneiden wird die Tabelle geleert, die Definition wird jedoch nicht entfernt.


3

Durch Abschneiden der Tabelle wird die Tabelle geleert. Durch das Löschen der Tabelle wird sie vollständig gelöscht. Beides wird schnell sein, aber das Löschen wird wahrscheinlich schneller sein (abhängig von Ihrer Datenbank-Engine).

Wenn Sie es nicht mehr benötigen, lassen Sie es fallen, damit Ihr Schema nicht überladen wird.


3

TableA anstelle von TRUNCATE TableA LÖSCHEN? Ein häufiges Missverständnis ist, dass sie dasselbe tun. Nicht so. In der Tat gibt es viele Unterschiede zwischen den beiden.

DELETE ist eine protokollierte Operation pro Zeile. Dies bedeutet, dass das Löschen jeder Zeile protokolliert und physisch gelöscht wird.

Sie können jede Zeile LÖSCHEN, die nicht gegen eine Einschränkung verstößt, während Sie den Fremdschlüssel oder eine andere Einschränkung beibehalten.

TRUNCATE ist ebenfalls eine protokollierte Operation, jedoch auf andere Weise. TRUNCATE protokolliert die Freigabe der Datenseiten, auf denen die Daten vorhanden sind. Die Freigabe von Datenseiten bedeutet, dass Ihre Datenzeilen tatsächlich noch auf den Datenseiten vorhanden sind, die Bereiche jedoch zur Wiederverwendung als leer markiert wurden. Dies macht TRUNCATE zu einer schnelleren Operation, die über DELETE ausgeführt werden kann.

Sie können eine Tabelle mit Fremdschlüsseleinschränkungen nicht TRUNCATE. Sie müssen die Einschränkungen entfernen, die Tabelle TRUNCATE und die Einschränkungen erneut anwenden.

TRUNCATE setzt alle Identitätsspalten auf den Standard-Startwert zurück.


"Das Löschen jeder Zeile wird protokolliert und physisch gelöscht" . Bist du sicher, dass das richtig ist? Der MSDN-Blog sagt, dass sie nicht sofort gelöscht werden. So funktioniert auch Postgres.
Brad Koch

2

Beim Abschneiden werden alle Zeilen entfernt, jedoch nicht die Tabelle selbst. Dies entspricht im Wesentlichen dem Löschen ohne where-Klausel, ist jedoch normalerweise schneller.


Das Abschneiden ist schneller, da die Transaktion nicht protokolliert wird (glaube ich), sodass Sie nicht wie bei einem Löschvorgang von einem Abschneiden zurücksetzen können.
Steven Murawski

2

Ich habe eine Korrektur für eine der obigen Aussagen ... "Abschneiden kann nicht zurückgesetzt werden"

Abschneiden kann zurückgesetzt werden. In einigen Fällen können Sie keine Tabelle zum Abschneiden oder Löschen erstellen, z. B. wenn Sie eine Fremdschlüsselreferenz haben. Für eine Aufgabe wie die monatliche Berichterstattung würde ich den Tisch wahrscheinlich einfach fallen lassen, wenn ich ihn nicht mehr benötige. Wenn ich dieses Rollup-Reporting häufiger durchführen würde, würde ich wahrscheinlich stattdessen die Tabelle behalten und "Abschneiden" verwenden.

Hoffe das hilft, hier sind einige weitere Informationen, die Sie nützlich finden sollten ...

Weitere Informationen finden Sie im folgenden Artikel: http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

Weitere Informationen zu Löschen und Abschneiden finden Sie in diesem Artikel: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

Vielen Dank! Jeff


2

TRUNCATE TABLE ist funktional identisch mit der DELETE-Anweisung ohne WHERE-Klausel: Beide entfernen alle Zeilen in der Tabelle. TRUNCATE TABLE ist jedoch schneller und benötigt weniger System- und Transaktionsprotokollressourcen als DELETE.

Die DELETE-Anweisung entfernt Zeilen nacheinander und zeichnet für jede gelöschte Zeile einen Eintrag im Transaktionsprotokoll auf. TRUNCATE TABLE entfernt die Daten durch Freigabe der Datenseiten, die zum Speichern der Tabellendaten verwendet werden, und nur die Freigaben der Seiten werden im Transaktionsprotokoll aufgezeichnet.

TRUNCATE TABLE entfernt alle Zeilen aus einer Tabelle, aber die Tabellenstruktur und ihre Spalten, Einschränkungen, Indizes usw. bleiben erhalten. Der von einer Identität für neue Zeilen verwendete Zähler wird auf den Startwert für die Spalte zurückgesetzt. Wenn Sie den Identitätszähler beibehalten möchten, verwenden Sie stattdessen DELETE. Wenn Sie die Tabellendefinition und ihre Daten entfernen möchten, verwenden Sie die Anweisung DROP TABLE.

Sie können TRUNCATE TABLE nicht für eine Tabelle verwenden, auf die durch eine FOREIGN KEY-Einschränkung verwiesen wird. Verwenden Sie stattdessen die Anweisung DELETE ohne WHERE-Klausel. Da TRUNCATE TABLE nicht protokolliert wird, kann kein Trigger aktiviert werden.

TRUNCATE TABLE darf nicht für Tabellen verwendet werden, die an einer indizierten Ansicht teilnehmen.

Von http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx


2

Im SQL-Standard entfernt die DROP-Tabelle die Tabelle und das Tabellenschema - TRUNCATE entfernt alle Zeilen.


1

Die Antworten hier stimmen mit der Frage überein, aber ich werde die Frage beantworten, die Sie nicht gestellt haben. "Soll ich Abschneiden oder Löschen verwenden?" Wenn Sie alle Zeilen aus einer Tabelle entfernen, möchten Sie normalerweise abschneiden, da dies viel schneller ist. Warum ist es viel schneller? Zumindest im Fall von Oracle wird die Hochwassermarke zurückgesetzt . Dies ist im Grunde eine Dereferenzierung der Daten und ermöglicht es der Datenbank, sie für etwas anderes wiederzuverwenden.


1

LÖSCHEN GEGEN TRUNCATE

  1. Die DELETEAnweisung entfernt die Zeilen einzeln und zeichnet für jede gelöschte Zeile einen Eintrag im Transaktionsprotokoll auf. TRUNCATE TABLEEntfernt die Daten durch Freigabe der zum Speichern der Tabellendaten verwendeten Datenseiten und zeichnet nur die Freigaben der Seite im Transaktionsprotokoll auf
  2. Wir können WHEREKlausel in verwenden, DELETEaber in können TRUNCATESie sie nicht verwenden
  3. Wenn die DELETEAnweisung mit einer Zeilensperre ausgeführt wird, wird jede Zeile in der Tabelle zum Löschen gesperrt. TRUNCATE TABLESperrt immer die Tabelle und die Seite, aber nicht jede Zeile
  4. Nachdem eine DELETEAnweisung ausgeführt wurde, kann die Tabelle noch leere Seiten enthalten. Wenn beim Löschvorgang keine Tabellensperre verwendet wird, enthält die Tabelle (Heap) viele leere Seiten. Bei Indizes kann der Löschvorgang leere Seiten zurücklassen, obwohl diese
    Seiten durch einen Hintergrundbereinigungsprozess schnell freigegeben werden
  5. TRUNCATE TABLE Entfernt alle Zeilen aus einer Tabelle, aber die Tabellenstruktur und ihre Spalten, Einschränkungen, Indizes usw. bleiben erhalten
  6. DELETEAnweisung ist keine RESEEDIdentitätsspalte, sondern TRUNCATEAnweisung RESEEDSdie IDENTITYSpalte
  7. Sie können nicht TRUNCATE TABLEfür Tabellen verwenden, die:
    1. Werden durch eine FOREIGN KEYEinschränkung referenziert . (Sie können eine Tabelle mit einem Fremdschlüssel abschneiden, der auf sich selbst verweist.)
    2. Nehmen Sie an einer indizierten Ansicht teil.
    3. Werden mithilfe der Transaktionsreplikation oder der Zusammenführungsreplikation veröffentlicht
  8. TRUNCATE TABLE Ein Trigger kann nicht aktiviert werden, da bei der Operation keine einzelnen Zeilenlöschungen protokolliert werden

1

Anweisung löschen

Delete-Anweisung Löschen Sie Tabellenzeilen und geben Sie die Anzahl der Zeilen zurück, die aus der Tabelle gelöscht wurden. In dieser Anweisung verwenden wir die where-Klausel, um Daten aus der Tabelle zu löschen

  • Die Anweisung "Löschen" ist langsamer als die Anweisung "Abschneiden", da Datensätze nacheinander gelöscht werden

Anweisung abschneiden

Anweisung abschneiden Löscht oder entfernt alle Zeilen aus der Tabelle.

  • Es ist schneller als die Delete-Anweisung, da alle Datensätze aus der Tabelle gelöscht wurden
  • Truncate-Anweisung nicht zurückgeben Die Anzahl der Zeilen wird aus der Tabelle gelöscht

Drop-Anweisung

Die Drop-Anweisung löschte alle Datensätze sowie die Struktur der Tabelle


1

Drop Drop ganze Tabelle und ihre gesamte Struktur

truncate löschen alle Zeilen aus der Tabelle unterscheidet es sich von löschen ist , dass es auch löschen Indizes der Zeilen


0

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 einer DELETE-Operation müssen Sie die Transaktion COMMIT oder ROLLBACK ausführen, um die Änderung dauerhaft zu machen oder rückgängig zu machen.

KÜRZEN

TRUNCATE entfernt alle Zeilen aus einer Tabelle. Der Vorgang kann nicht rückgängig gemacht werden. Daher ist TRUCATE schneller und benötigt nicht so viel Speicherplatz wie ein DELETE.

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

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.