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.
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.
Antworten:
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
DROP TABLE löscht die Tabelle.
TRUNCATE TABLE leert es, lässt aber seine Struktur für zukünftige Daten.
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.
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.
set the row count zero
Der Identitätswert wird tatsächlich auf den ursprünglichen Identitätsstartwert zurückgesetzt.
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)
DROP
ist im Grunde nur ein TRUNCATE
gefolgt vom Löschen von Tabellenmetadaten aus den Systemtabellen. Sehen Sie diese Frage hier
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.
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 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.
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.
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.
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.
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.
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
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
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.
DELETE
Anweisung entfernt die Zeilen einzeln und zeichnet für jede gelöschte Zeile einen Eintrag im Transaktionsprotokoll auf. TRUNCATE TABLE
Entfernt die Daten durch Freigabe der zum Speichern der Tabellendaten verwendeten Datenseiten und zeichnet nur die Freigaben der Seite im Transaktionsprotokoll aufWHERE
Klausel in verwenden, DELETE
aber in können TRUNCATE
Sie sie nicht verwendenDELETE
Anweisung mit einer Zeilensperre ausgeführt wird, wird jede Zeile in der Tabelle zum Löschen gesperrt. TRUNCATE TABLE
Sperrt immer die Tabelle und die Seite, aber nicht jede ZeileDELETE
Anweisung 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 TRUNCATE TABLE
Entfernt alle Zeilen aus einer Tabelle, aber die Tabellenstruktur und ihre Spalten, Einschränkungen, Indizes usw. bleiben erhaltenDELETE
Anweisung ist keine RESEED
Identitätsspalte, sondern TRUNCATE
Anweisung RESEEDS
die
IDENTITY
SpalteTRUNCATE TABLE
für Tabellen verwenden, die:
FOREIGN KEY
Einschränkung referenziert . (Sie können eine Tabelle mit einem Fremdschlüssel abschneiden, der auf sich selbst verweist.)TRUNCATE TABLE
Ein Trigger kann nicht aktiviert werden, da bei der Operation keine einzelnen Zeilenlöschungen protokolliert werdenAnweisung 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
Anweisung abschneiden
Anweisung abschneiden Löscht oder entfernt alle Zeilen aus der Tabelle.
Drop-Anweisung
Die Drop-Anweisung löschte alle Datensätze sowie die Struktur der Tabelle
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