FALL vs Mehrere UPDATE-Abfragen für große Datenmengen - Leistung
Für die Leistung, welche option wäre besser für große Datensätze, die aktualisiert werden sollen?
Mithilfe einer CASE-Anweisung oder Einzelne update-Abfragen?
Beispiel:
UPDATE tbl_name SET field_name =
CASE
WHEN condition_1 THEN 'Blah'
WHEN condition_2 THEN 'Foo'
WHEN condition_x THEN 123
ELSE 'bar'
END AS value
Einzelne Abfrage Beispiel:
UPDATE tbl_name SET field_name = 'Blah' WHERE field_name = condition_1
UPDATE tbl_name SET field_name = 'Foo' WHERE field_name = condition_2
UPDATE tbl_name SET field_name = 123 WHERE field_name = condition_x
UPDATE tbl_name SET field_name = 'bar' WHERE field_name = condition_y
HINWEIS: Über 300.000 Datensätze werden aktualisiert, und die CASE-Anweisung hätte über die 10.000, WENN sich die Verhältnisse. Wenn Sie mit den einzelnen Abfragen, die etwa 10.000 sowie
- "Wenn mit den einzelnen Abfragen, die etwa 10.000 als gut" - vielleicht ein gemeinsames temp-Tabelle wäre eine bessere Idee....
- +1 Mitch...habe nicht bemerkt, den Anwendungsbereich, wenn ich schrieb meine Antwort. Im Prinzip
CASE
wird effizienter sein, aber vielleicht nicht in dieser Größenordnung. - Interessant, hätte ich nicht gedacht von diesem Ansatz, Danke
- Bei Verwendung der option 2, die Sie haben zu stellen Sie sicher, dass Sie alles in einer Transaktion (kein autocommit!) - in diesem Fall bin ich geneigt zu glauben, dass gibt es keinen großen Unterschied zwischen den beiden vor allem, wenn field_name indiziert ist. Aber Sie wird haben um für sich selbst ausprobieren. Es ist mehr oder weniger unmöglich, um Ihnen eine korrekte Antwort ohne Zugriff auf Ihr system.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die
CASE
version.Dies ist, weil es eine gute chance, dass Sie die änderung der gleichen Zeile mehr als einmal mit den einzelnen Aussagen. Wenn Zeile 10 hat sowohl
condition_1
undcondition_y
dann wird es brauchen, um zu Lesen und verändert sich zweimal. Wenn Sie einen clustered-index dies bedeutet, dass zwei gruppierten index updates on top, was den anderen Bereich(en) gab, die geändert wurden.Wenn Sie es tun können, wie eine einzelne Anweisung, jede Zeile wird nur einmal gelesen und es sollte laufen viel schneller.
Änderte ich einen ähnlichen Prozess über ein Jahr her, dass verwendet Dutzende von
UPDATE
- Anweisungen in der Reihenfolge zu verwenden, daUPDATE
mitCASE
- und Bearbeitungszeit sank über 80%.Scheint es die Logik zu mir, dass auf die erste option SQL Server gehen Sie durch die Tabelle nur einmal für jede Zeile, wird es den Zustand bewerten.
Auf dem zweiten, es wird gehen müssen durch alle Tabelle 4-mal
So, in einer Tabelle mit 1000 Zeilen, auf die erste option auf das beste-case-Szenario sprechen wir über 1000 Bewertungen und im schlechtesten Fall 3000.
Auf der zweiten werden wir immer haben 4000 Bewertungen
Also option 1 wäre das schneller.
Wie bereits von Mitch, versuchen Sie es mit einer temp-Tabelle ausfüllen mit allen Daten, die Sie benötigen, um ein anderes temp-Tabelle für jede Spalte (Feld), die Sie ändern möchten. Sollten Sie auch ein index, um die temp-Tabelle(N) für zusätzliche performance-Verbesserung.
Diese Weise Ihre update-Anweisung wird (mehr oder weniger):
usw..
Dies sollte Ihnen eine gute Leistung während der Skalierung für große Mengen von updates auf einmal.