Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

UPDATE oder MERGE von sehr großen Tabellen in SQL Server

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:

  1. 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ätzliche condition angeben das verengt den zusammenzuführenden Teil.
  2. 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