Frage

Ich hatte alle Zeilen aus einer Log-Tabelle zu löschen, die etwa 5 Millionen Zeilen enthalten. Mein erster Versuch war der folgenden Befehl in Query Analyzer zur Ausgabe:

löschen von client_log

, die eine sehr lange Zeit in Anspruch nahm.

War es hilfreich?

Lösung

Sehen Sie sich Tabelle gestutzt, die viel schneller ist.

Andere Tipps

Ich entdeckte die TRUNCATE TABLE in der Msdn Transact-SQL-Referenz. Für alle hier interessiert sind die Bemerkungen:

TRUNCATE TABLE ist funktional identisch Anweisung ohne WHERE-Klausel zu löschen: sowohl alle Zeilen in der Tabelle entfernen. Aber TRUNCATE TABLE ist schneller und verwendet weniger System und Transaktionsprotokoll Ressourcen als DELETE.

Die DELETE-Anweisung entfernt Zeilen einen nach dem anderen und nimmt einen Eintrag in dem Transaktionsprotokoll für jede gelöschte Zeile. TRUNCATE TABLE löscht die Daten durch die Datenseiten Aufheben der Zuordnung verwendet die Daten der Tabelle zu speichern und nur die Seite Zuordnungsaufhebungen werden im Transaktionsprotokoll aufgezeichnet.

TRUNCATE TABLE löscht alle Zeilen aus einer Tabelle, aber die Tabellenstruktur und ihre Spalten, Einschränkungen, Indizes und so weiter bleiben. Der Zähler, die von einer Identität für neue Zeilen wieder auf den Samen für die Spalte. Wenn Sie die Identität Zähler beibehalten möchten, verwenden Sie stattdessen DELETE. Wenn Sie möchten, Tabellendefinition und seine Daten löschen, die DROP TABLE-Anweisung verwenden.

Sie können nicht TRUNCATE TABLE auf eine Tabelle durch eine FOREIGN KEY-Einschränkung verwiesen verwenden; Verwenden Sie stattdessen DELETE-Anweisung ohne WHERE-Klausel. Da TRUNCATE TABLE nicht angemeldet ist, kann es keinen Trigger aktivieren.

TRUNCATE TABLE nicht auf Tabellen verwendet werden kann, in einer indizierten Sicht teilnehmen.

Es ist ein weit verbreiteter Mythos, dass irgendwie TRUNCATE springt Transaktionsprotokoll.

Das ist Missverständnis, und ist deutlich in MSDN erwähnt.

Dieser Mythos wird in mehreren Kommentaren hier aufgerufen. Lassen Sie uns auszurotten es zusammen;)

TRUNCATE TABLE funktioniert auch auf MySQL

vergessen truncate und löschen. pflegen Sie Ihre Tabellendefinitionen (falls Sie es neu erstellen möchten) und nur Drop-Tabelle verwenden.

Ich verwende die folgende Methode Tabellen auf Null aus, mit dem zusätzlichen Bonus, dass es läßt mich mit einem Archiv Kopie der Tabelle.

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;

truncate table ist nicht SQL-plattformunabhängig. Wenn Sie den Verdacht haben, dass Sie Macht je Datenbank-Anbieter ändern, können Sie es verwenden vorsichtig sein.

Auf SQL Server können Sie den Truncate Table Befehl verwenden, die schneller als ein normales Löschen ist und verwendet auch weniger Ressourcen. Es wird zurückgesetzt, keine Identität Felder zurück zum Startwert als auch.

Die Nachteile von truncate sind, dass es nicht auf Tabellen verwendet werden kann, die durch Fremdschlüssel referenziert wird, und es wird alle Trigger nicht ausgelöst. Auch werden Sie nicht in der Lage, die Daten rückgängig zu machen, wenn etwas schief geht.

Beachten Sie, dass TRUNCATE wird auch jede Auto increment Schlüssel zurückgesetzt, wenn Sie diejenigen verwenden.

Wenn Sie nicht wünschen, Ihre Auto-increment Schlüssel zu verlieren, können Sie das löschen beschleunigen, indem Sie in den Sätzen zu löschen (zum Beispiel von Tabelle DELETE WHERE id> 1 und id <10000). Es wird deutlich beschleunigen und in einigen Fällen verhindern, dass Daten nach oben erfasst werden kann.

Ja, na ja, das Löschen 5 Millionen Zeilen ist wahrscheinlich eine lange Zeit in Anspruch nehmen. Der einzigen potenziell schneller Weg, ich denken kann, wäre die Tabelle zu löschen und neu erstellen. Das funktioniert nur, natürlich, wenn Sie alle Daten in der Tabelle löschen.

truncate table client_log

ist die beste Wahl, gestutzt tötet alle Inhalte in der Tabelle und Indizes und setzt alle Samen Sie zu haben.

Der Vorschlag von „Drop und die Tabelle neu erstellen“ ist wahrscheinlich nicht gut, weil das Ihre Fremdschlüssel goofs auf.

Sie verwenden Fremdschlüssel, nicht wahr?

Wenn Sie nicht TRUNCATE TABLE wegen Fremdschlüssel und / oder Trigger verwenden können, können Sie prüfen, zu:

  • fallen alle Indizes;
  • Sie die üblichen DELETE;
  • neu erstellen alle Indizes.

Dies kann bis DELETE etwas beschleunigen.

Ich Revision meine frühere Aussage:

  

Sie sollten verstehen, dass durch die Verwendung   Kürzen Sie die Daten werden gelöscht, aber   nichts wird das protokolliert   Transaktionsprotokoll. Das Schreiben in das Protokoll   Deshalb immer auf 5 nehmen DELETE   Millionen Zeilen. Ich benutze TRUNCATE oft   während der Entwicklung, aber man sollte sein   vorsichtig über sie auf einer Produktion mit   Datenbank, weil Sie nicht in der Lage sein,   Ihre Änderungen rückgängig zu machen. Du solltest   machen sofort eine vollständige Datenbank   Sicherung nach einem TRUNCATE tun zu   schafft eine neue Grundlage für die Restaurierung.

Die obige Aussage sollte mit der Aufforderung, um sicher zu sein, dass Sie verstehen, dass es Unterschiede zwischen den beiden. Leider ist es schlecht geschrieben und macht nicht unterstützte Aussagen, wie ich habe nicht wirklich jeder selbst zwischen den beiden Tests durchgeführt. Es basiert auf Aussagen, die ich von anderen gehört haben.

MSDN :

  

Die DELETE-Anweisung entfernt Reihen   zu einem Zeitpunkt, und zeichnet einen Eintrag in der   Transaktionsprotokoll für jede Zeile gelöscht.   TRUNCATE TABLE löscht die Daten durch   Aufheben der Zuordnung der Datenseiten verwendet   speichert die Daten der Tabelle und nur die   Seite Aufheben dieser Zuordnungen sind in der aufgezeichneten   Transaktionsprotokoll.

Ich wollte nur sagen, dass es einen grundlegenden Unterschied zwischen den beiden ist, und weil es einen Unterschied gibt, wird es Anwendungen, in denen der eine oder andere ungeeignet sein kann.

DELETE * FROM table_name;

Vorzeitige Optimierung kann gefährlich sein. Optimizing bedeuten mag etwas seltsam zu tun, aber wenn es funktioniert, können Sie in Anspruch nehmen.

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;

Für Geschwindigkeit Ich denke, es hängt davon ab ...

  • Die zugrunde liegende Datenbank: Oracle, Microsoft, MySQL, PostgreSQL, andere, benutzerdefinierte ...

  • Die Tabelle, um es der Inhalt und die damit verbundene Tabellen:

Es kann Löschregeln sein. Gibt es eine bestehende Prozedur alle Inhalte in der Tabelle zu löschen? Kann dies für den jeweiligen zugrunde liegenden Datenbank-Engine optimiert werden? Wie viel wir kümmern uns um die Dinge / bezogene Daten zu brechen? ein DELETE-Performing kann der ‚sicherste‘ Weg, unter der Annahme, dass andere ähnliche Tabellen zu dieser Tabelle nicht abhängen. Gibt es noch andere Tabellen und Abfragen, die auf den Daten in dieser Tabelle beziehen sich / ab? Wenn wir nicht viel kümmern sich um diese Tabelle um zu sein, DROP verwenden könnte eine schnelle Methode sein, wieder auf der zugrunde liegende Datenbank abhängig.

DROP TABLE table_name;

Wie viele Zeilen gelöscht werden? Gibt es andere Informationen, die schnell aufgelesen wird, der die Löschung optimieren? Zum Beispiel können wir sagen, ob die Tabelle bereits leer ist? Können wir Hunderte gibt es Tausende, Millionen, Milliarden von Zeilen sagen, wenn?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top