Tatsächlich habe ich allgemeine Empfehlungen für solche Abfragen herausgefunden:Die Idee, SQL Merge oder Update zu verwenden, ist sehr clever, aber sie schlägt fehl, wenn wir viele Datensätze aktualisieren müssen (dh 75M ) in einer großen und breiten Tabelle (z. B. 240 MB ).
Wenn wir uns den Abfrageplan der Abfrage unten ansehen, können wir sagen, dass TABLE SCAN
von TABELLE1 und abschließend MERGE
nehmen 90 % der Zeit in Anspruch.
MERGE TABLE1 as Target
USING UTABLE as source
ON Target.record_id = source.record_id
WHEN MATCHED AND (condition) THEN
UPDATE SET Target.columns=source.columns
Um also MERGE zu verwenden, müssen wir:
- Reduzieren Sie die Anzahl der Zeilen, die wir aktualisieren müssen, und übergeben Sie diese Informationen korrekt an SQL Server. Dies kann durch Erstellen von
UTABLE
erfolgen kleiner oder zusätzlichecondition
angeben das verengt den zusammenzuführenden Teil. - Stellen Sie sicher, dass der zusammenzuführende Teil in den Speicher passt, da sonst die Abfrage viel langsamer ausgeführt wird. Erstellen von
TABLE1
zweimal weniger hat meine tatsächliche Abfragezeit von 11 Stunden auf 40 Minuten reduziert.
Wie Mark erwähnt hat, können Sie UPDATE
verwenden Syntax und verwenden Sie WHERE
-Klausel, um den zusammenzuführenden Teil zu verengen - dies führt zu denselben Ergebnissen. Bitte vermeiden Sie auch die Indexierung von TABLE1
da dies zusätzliche Arbeit verursacht, um den Index während MERGE
neu zu erstellen