Löschen Sie große Datenmengen auf dem SQL-Server

8

Angenommen, ich habe eine Tabelle mit 10000000 Datensatz. Was ist der Unterschied zwischen diesen beiden Lösungen?

  1. lösche Daten wie:

    %Vor%
  2. 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?

    
masoud ramezani 26.01.2010, 09:50
quelle

7 Antworten

14

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.

    
Nils Schmidt 26.01.2010, 09:57
quelle
21

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%     
AdaTheDev 26.01.2010 10:12
quelle
3

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.

    
user151323 26.01.2010 09:53
quelle
3

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 wird

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

    
Andrew 26.01.2010 09:56
quelle
2

Die beste Leistung zum Löschen einer Tabelle würde TRUNCATE TABLE MyTable bringen. Siehe Ссылка für eine ausführlichere Erläuterung

    
Scoregraphic 26.01.2010 09:57
quelle
0

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

    
Patrick 26.01.2010 09:58
quelle
0

Gefunden posten Sie im Microsoft TechNet .

Grundsätzlich empfiehlt es:

  1. Kopieren Sie mit SELECT INTO die Daten, die Sie BEHALTEN möchten, in eine Zwischentabelle;
  2. Kürzen Sie die Quellentabelle;
  3. Kopieren Sie mit INSERT INTO aus der Zwischentabelle die Daten in die Quelltabelle;

..

%Vor%     
Bob Rivers 03.09.2014 20:10
quelle