Angenommen, ich habe eine Tabelle mit 10000000 Datensatz. Was ist der Unterschied zwischen diesen beiden Lösungen?
lösche Daten wie:
%Vor%Löschen Sie alle Daten mit einer Anwendung Zeile für Zeile:
%Vor%Hat die erste Lösung die beste Leistung? Wie wirkt sich das auf Protokoll und Leistung aus?
Wenn Sie so viele Datensätze in Ihrer Tabelle haben und Sie alle löschen möchten, sollten Sie truncate <table>
anstelle von delete from <table>
berücksichtigen. Es wird viel schneller sein, aber sei dir bewusst, dass es keinen Trigger aktivieren kann.
Weitere Informationen finden Sie in diesem Fall (sql server 2000): Ссылка
Das Löschen der Tabelle innerhalb der Anwendung Zeile für Zeile endet sehr lange, da Ihre dbms nichts optimieren kann, da sie nicht im Voraus weiß, dass Sie löschen werden alles.
Wenn Sie einschränken müssen, welche Zeilen Sie löschen müssen und nicht komplett löschen müssen, oder Sie TRUNCATE TABLE nicht verwenden können (z. B. die Tabelle wird durch eine FK-Einschränkung referenziert oder in eine indizierte Sicht eingeschlossen), dann Sie können das Löschen in Blöcken durchführen:
%Vor%Im Allgemeinen ist TRUNCATE der beste Weg, und ich würde das verwenden, wenn möglich. Aber es kann nicht in allen Szenarien verwendet werden. Beachten Sie auch, dass TRUNCATE den IDENTITY-Wert für die Tabelle zurücksetzt, falls es einen gibt.
Wenn Sie SQL 2000 oder früher verwenden, ist die TOP-Bedingung nicht verfügbar. Sie können stattdessen SET ROWCOUNT verwenden.
%Vor%Die erste hat eindeutig bessere Leistung.
Wenn Sie DELETE [MyTable] angeben, wird einfach alles gelöscht, ohne die ID zu überprüfen. Der zweite wird Zeit und Festplattenbetrieb verschwenden, um jedes Mal einen entsprechenden Datensatz zu finden, bevor er gelöscht wird.
Es wird auch noch schlimmer, denn jedes Mal, wenn ein Datensatz aus der Mitte des Tisches verschwindet, möchte der Motor möglicherweise Daten auf der Festplatte komprimieren, was Zeit und Arbeit kostet.
Vielleicht wäre es eine bessere Idee, Daten basierend auf Clustered-Index-Spalten in absteigender Reihenfolge zu löschen. Dann wird die Tabelle bei jedem Löschvorgang grundsätzlich vom Ende abgeschnitten.
Option 1 erstellt eine sehr große Transaktion und hat große Auswirkungen auf das Protokoll / die Leistung sowie auf eskalierende Sperren, sodass die Tabelle nicht verfügbar ist. Option 2 wird langsamer sein, obwohl es weniger Auswirkungen auf das Protokoll (unter Annahme von Bulk / Full-Modus)
generieren wirdWenn Sie alle Daten loswerden möchten, wäre die Tabelle "Meine Tabelle abschneiden" schneller als beides, obwohl sie keine Möglichkeit zum Filtern von Zeilen bietet, sondern eine Metadatenänderung auf der Rückseite und im Grunde die IAM auf dem Boden für die Tabelle in Frage.
Die beste Leistung zum Löschen einer Tabelle würde TRUNCATE TABLE MyTable
bringen. Siehe Ссылка für eine ausführlichere Erläuterung
Der erste löscht alle die Daten aus der Tabelle und hat eine bessere Leistung als Ihr zweiter, der nur Daten von einem bestimmten Schlüssel löscht .
Wenn Sie jetzt alle Daten aus der Tabelle löschen müssen und nicht auf die Verwendung von Rollback angewiesen sind, denken Sie an die Verwendung eines Tabelle abschneiden
Gefunden posten Sie im Microsoft TechNet .
Grundsätzlich empfiehlt es:
..
%Vor%Tags und Links sql-server performance sql-delete