- 20.08.2019
- 25 Minuten zum Lesen
-
- X
- c
- j
- r
- a
-
+18
Gilt für: SQL Server (alle unterstützten Versionen) Azure SQL-Datenbank Azure Synapse Analytics
Führt Einfüge-, Aktualisierungs- oder Löschvorgänge für eine Zieltabelle aus aus die Ergebnisse eines Joins mit einer Quelltabelle. Synchronisieren Sie beispielsweise zwei Tabellen, indem Sie Zeilen in eine Tabelle einfügen, aktualisieren oder löschen, basierend auf den Unterschieden in der anderen Tabelle.
Hinweis
MERGE befindet sich derzeit in der Vorschau für Azure Synapse Analytics.
Leistungstipp: Das für die MERGE-Anweisung beschriebene bedingte Verhalten funktioniert am besten, wenn die beiden Tabellen eine komplexe Mischung übereinstimmender Merkmale aufweisen. Fügen Sie beispielsweise eine Zeile ein, wenn sie nicht vorhanden ist, oder aktualisieren Sie eine Zeile, wenn sie übereinstimmt. Wenn Sie einfach eine Tabelle basierend auf den Zeilen einer anderen Tabelle aktualisieren, verbessern Sie die Leistung und Skalierbarkeit mit den grundlegenden Anweisungen INSERT, UPDATE und DELETE Beispiel:
Transact-SQL-Syntaxkonventionen
Syntax
Hinweis
Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 und frühere Versionen finden Sie in der Dokumentation zu früheren Versionen.
Argumente
WITH < common_table_expression >
Gibt die temporär benannte Ergebnismenge oder Ansicht an, die auch als allgemeiner Tabellenausdruck bezeichnet wird und definiert ist im Rahmen der MERGE-Erklärung. Die Ergebnismenge stammt aus einer einfachen Abfrage und wird von der MERGE-Anweisung referenziert. Weitere Informationen finden Sie unter WITH common_table_expression (Transact-SQL).
TOP (Ausdruck)
Gibt die Anzahl oder den Prozentsatz der betroffenen Zeilen an. Ausdruck kann entweder eine Zahl oder ein Prozentsatz der Zeilen sein. Die Zeilen, auf die im TOP-Ausdruck verwiesen wird, sind in keiner Reihenfolge angeordnet. Weitere Informationen finden Sie unter TOP (Transact-SQL).
Die TOP-Klausel gilt nach der Verknüpfung der gesamten Quelltabelle und der gesamten Zieltabelle sowie der verknüpften Zeilen, die sich nicht für ein Einfügen, Aktualisieren oder qualifizieren Löschaktionen werden entfernt. Die TOP-Klausel reduziert die Anzahl der verknüpften Zeilen weiter auf den angegebenen Wert. Die Einfüge-, Aktualisierungs- oder Löschaktionen gelten für die verbleibenden verknüpften Zeilen in ungeordneter Weise. Das heißt, es gibt keine Reihenfolge, in der die Zeilen werden auf die in den WHEN-Klauseln definierten Aktionen verteilt. Die Angabe von TOP (10) wirkt sich beispielsweise auf 10 Zeilen aus. Von diesen Zeilen können 7 aktualisiert und 3 eingefügt oder 1 gelöscht, 5 aktualisiert und 4 eingefügt usw. werden.
Da die MERGE-Anweisung einen vollständigen Tabellenscan sowohl der Quelle als auch der Quelle ausführt Bei Zieltabellen wird die E / A-Leistung manchmal beeinträchtigt, wenn die TOP-Klausel zum Ändern einer großen Tabelle durch Erstellen mehrerer Stapel verwendet wird. In diesem Szenario ist es wichtig sicherzustellen, dass alle aufeinanderfolgenden Stapel auf neue Zeilen abzielen.
Datenbankname
Der Name der Datenbank, in der sich die Zieltabelle befindet.
Schemaname
Der Name des Schemas, zu dem target_table gehört.
target_table
Die Tabelle oder Ansicht, für die die Datenzeilen von < table_source > werden basierend auf < Klausel-Suchbedingung > abgeglichen. target_table ist das Ziel aller Einfüge-, Aktualisierungs- oder Löschvorgänge angegeben durch die WHEN-Klauseln der MERGE-Anweisung.
Wenn target_table eine Ansicht ist, müssen alle Aktionen dagegen die Bedingungen für die Aktualisierung von Ansichten erfüllen. Weitere Informationen finden Sie unter Ändern von Daten über eine Ansicht.
target_table kann keine entfernte Tabelle sein. In target_table können keine Regeln definiert sein.
table_alias
Ein alternativer Name zum Verweisen auf eine Tabelle für die target_table.
USING < table_source >
Gibt die Datenquelle an, die mit den Datenzeilen in target_table übereinstimmt, basierend auf der < merge_search-Bedingung >. Das Ergebnis dieser Übereinstimmung bestimmt die Aktionen, die von den WHEN-Klauseln der MERGE-Anweisung ausgeführt werden sollen. < table_source > kann eine entfernte Tabelle oder eine abgeleitete Tabelle sein, die auf entfernte Tabellen zugreift.
< table_source > kann eine abgeleitete Tabelle sein, die den Transact-SQL-Tabellenwertkonstruktor verwendet, um eine Tabelle durch Angabe mehrerer Zeilen zu erstellen.
table_alias
Ein alternativer Name zum Verweisen auf eine Tabelle für die table_source.
Weitere Informationen zur Syntax und zu den Argumenten dieser Klausel finden Sie unter FROM (Transact-SQL).
ON < merge_search_condition >
Gibt die Bedingungen an, unter denen < table_source > verbindet sich mit target_table, um festzustellen, wo sie übereinstimmen.
Achtung
Es ist wichtig, nur anzugeben Die Spalten aus der Zieltabelle, die für Übereinstimmungszwecke verwendet werden sollen. Geben Sie also Spalten aus der Zieltabelle an, die mit der entsprechenden Spalte der Quelltabelle verglichen werden. Versuchen Sie nicht, die Abfrageleistung durch Herausfiltern von Zeilen in der Zieltabelle zu verbessern die ON-Klausel; Beispiel: Geben Sie AND NOT target_table.column_x = value
an. Dies kann zu unerwarteten und falschen Ergebnissen führen.
BEI DER PASSUNG < merge_matched >
Gibt an, dass alle Zeilen von * target_table mit den von < table_source > ON < merge_search_condition > und erfüllen alle zusätzlichen Suchbedingungen. Sie werden gemäß der < merge_matched -Klausel.
Die MERGE-Anweisung kann höchstens zwei WHEN MATCHED-Klauseln enthalten. Wenn zwei Klauseln angegeben sind, muss die erste Klausel von einer AND < search_condition > -Klausel begleitet werden. Für eine bestimmte Zeile wird die zweite WHEN MATCHED-Klausel nur angewendet, wenn die erste nicht „t“ ist. Wenn zwei WHEN MATCHED-Klauseln vorhanden sind, muss eine UPDATE-Aktion und eine DELETE-Aktion angegeben werden. Wenn UPDATE im < merge_matched > -Klausel und mehr als eine Zeile der < table_source > stimmt mit einer Zeile in target_table überein, die auf < merge_search_condition > basiert. SQL Server gibt einen Fehler zurück. Die MERGE-Anweisung kann“ t Aktualisieren Sie dieselbe Zeile mehrmals oder aktualisieren und löschen Sie dieselbe Zeile.
WENN SIE NICHT ZUSAMMENPASSEN < merge_not_matched >
Gibt an, dass für jede Zeile, die von < table_source > ON merge_search_condition >, die nicht mit einer Zeile in targ übereinstimmt et_table, erfüllt jedoch eine zusätzliche Suchbedingung, falls vorhanden. Die einzufügenden Werte werden durch die Klausel < merge_not_matched > angegeben. Die MERGE-Anweisung kann nur eine WHEN NOT MATCHED-Klausel enthalten.
WHEN NOT MATCHED BY SOURCE THEN < merge_matched >
Gibt an, dass alle Zeilen von * target_table, die nicht mit den von < table_source > ON < merge_search_condition >, die eine zusätzliche Suchbedingung erfüllen, werden gemäß < merge_matched aktualisiert oder gelöscht > -Klausel.
Die MERGE-Anweisung kann höchstens zwei WHEN NOT MATCHED BY SOURCE-Klauseln enthalten. Wenn zwei Klauseln angegeben sind, muss die erste Klausel von begleitet werden eine AND < -Klausel_search_condition > -Klausel. Für jede gegebene Zeile wird die zweite Klausel WHEN NOT MATCHED BY SOURCE nur angewendet, wenn die erste nicht “ t. Wenn es zwei WHEN NOT MATCHED BY SOURCE-Klauseln gibt, muss eine UPDATE-Aktion und eine DELETE-Aktion angegeben werden. In < -Klausel_Suchbedingung > kann nur auf Spalten aus der Zieltabelle verwiesen werden.
Wenn von < table_source > Auf Spalten in der Quelltabelle kann nicht zugegriffen werden. Wenn die in merge_matched > -Klausel verweist auf Spalten in der Quelltabelle, Fehler 207 (ungültiger Spaltenname) wird zurückgegeben. Beispielsweise wird die Klausel WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1
kann dazu führen, dass die Anweisung fehlschlägt, weil auf Col1
in der Quelltabelle nicht zugegriffen werden kann.
AND < Klausel_Suchbedingung >
Gibt eine gültige Suchbedingung an. Weitere Informationen finden Sie unter Suchbedingung (Transact-SQL).
< table_hint_limited >
Gibt einen oder mehrere Tabellenhinweise an, die für jede der th auf die Zieltabelle angewendet werden sollen e Einfügen, Aktualisieren oder Löschen von Aktionen, die von der MERGE-Anweisung ausgeführt werden. Das Schlüsselwort WITH und die Klammern sind erforderlich.
NOLOCK und READUNCOMMITTED sind nicht zulässig. Weitere Informationen zu Tabellenhinweisen finden Sie unter Tabellenhinweise (Transact-SQL).
Die Angabe des TABLOCK-Hinweises für eine Tabelle, die das Ziel einer INSERT-Anweisung ist, hat den gleichen Effekt wie die Angabe des TABLOCKX-Hinweises. Die Tabelle wird exklusiv gesperrt. Wenn FORCESEEK angegeben wird, gilt dies für Die implizite Instanz der Zieltabelle, die mit der Quelltabelle verknüpft ist.
Achtung
Wenn Sie READPAST mit WHEN NOT MATCHED THEN INSERT angeben, kann dies zu INSERT-Operationen führen, die gegen EINZIGARTIGE Einschränkungen verstoßen.
INDEX (index_val)
Gibt den Namen oder die ID eines oder mehrerer Indizes in der Zieltabelle für eine implizite Verknüpfung mit der Quelltabelle an. Weitere Informationen finden Sie unter Tabellenhinweise (Transaktion) -SQL).
< output_clause >
Gibt eine Zeile für jede Zeile in target_table zurück, die „s aktualisiert, eingefügt oder gelöscht in keiner bestimmten Reihenfolge. $ action kann in der Ausgabeklausel angegeben werden. $ action ist eine Spalte vom Typ nvarchar (10), die einen von drei Werten für jede Zeile zurückgibt: „INSERT“, „UPDATE“ oder „DELETE“, je nach der in dieser Zeile ausgeführten Aktion. Weitere Informationen zu den Argumenten und zum Verhalten dieser Klausel finden Sie unter OUTPUT-Klausel (Transact-SQL).
< merge_matched >
Gibt die Aktualisierungs- oder Löschaktion an, die auf alle Zeilen von target_table angewendet wird, die nicht mit den von < table_source ON < merge_search_condition >, die alle zusätzlichen Suchbedingungen erfüllen.
UPDATE SET < set_clause >
Gibt die Liste der zu aktualisierenden Spalten- oder Variablennamen in der Zieltabelle und die Werte an, mit denen sie aktualisiert werden sollen.
Weitere Informationen zu den Argumenten dieser Klausel finden Sie unter UPDATE (Transact-SQL). Das Festlegen einer Variablen auf denselben Wert wie eine Spalte wird nicht unterstützt.
LÖSCHEN
Gibt an, dass die Zeilen, die mit den Zeilen in der Zieltabelle übereinstimmen, gelöscht werden.
< merge_not_matched >
Gibt die Werte an, die in die Zieltabelle eingefügt werden sollen.
(Spaltenliste)
Eine Liste von einem oder Weitere Spalten der Zieltabelle, in die Daten eingefügt werden sollen. Spalten müssen als einteiliger Name angegeben werden. Andernfalls schlägt die MERGE-Anweisung fehl. column_list muss in Klammern eingeschlossen und durch Kommas getrennt sein.
VALUES ( values_list)
Eine durch Kommas getrennte Liste von Konstanten, Variablen oder Ausdrücken, die Werte zurückgeben, die in die Zieltabelle eingefügt werden sollen. Ausdrücke dürfen keine EXECUTE-Anweisung enthalten.
DEFAULT VALUES
Erzwingt die Zeile eingefügt, die die für jede Spalte definierten Standardwerte enthält.
Weitere Informationen zu dieser Klausel finden Sie unter INSERT (Transact-SQL).
< search_condition >
Speci Fies die Suchbedingungen, um < merge_search_condition > oder < Klausel_search_condition . Weitere Informationen zu den Argumenten für diese Klausel finden Sie unter Suchbedingung (Transact-SQL).
< Diagrammsuchmuster >
Gibt das Diagrammübereinstimmungsmuster an. Weitere Informationen zu den Argumenten für diese Klausel finden Sie unter MATCH (Transact-SQL).
Hinweise
Hinweis
In Azure Synapse Analytics wird MERGE verwendet Der Befehl (Vorschau) weist im Vergleich zu SQL Server und Azure SQL-Datenbank folgende Unterschiede auf:
- Ein MERGE-Update wird als Lösch- und Einfügepaar implementiert. Die Anzahl der betroffenen Zeilen für ein MERGE-Update umfasst die gelöschten und eingefügten Zeilen.
- Während der Vorschau werden Tabellen mit Identitätsspalte vom Befehl Synapse SQL MERGE nicht unterstützt.
- Die Unterstützung für Tabellen mit unterschiedlichen Verteilungstypen werden in dieser Tabelle beschrieben:
FUSIONSKLAUSEL in Azure Synapse Analytics Unterstützte TARGE-Verteilungstabelle Unterstützte SOURCE-Verteilungstabelle Kommentar WENN PASSEND Alle Verteilungstypen Alle Verteilungstypen NICHT ZIELGESTIMMT HASH Alle Verteilungstypen Verwenden Sie UPDATE / DELETE FROM… JOIN, um zwei Tabellen zu synchronisieren. NICHT MIT DER QUELLE ZUSAMMENGEPASST Alle Verteilungstypen Alle Verteilungstypen
Mindestens eine der drei MATCHED-Klauseln muss angegeben werden, kann jedoch in beliebiger Reihenfolge angegeben werden. Eine Variable kann nicht mehr als einmal in derselben MATCHED-Klausel aktualisiert werden.
Alle Einfügungs-, Aktualisierungs- oder Löschaktionen, die in der Zieltabelle durch die MERGE-Anweisung angegeben werden, sind durch alle darin definierten Einschränkungen begrenzt, einschließlich aller kaskadierenden Einschränkungen der referenziellen Integrität. Wenn IGNORE_DUP_KEY für eindeutige Indizes in der Zieltabelle aktiviert ist, ignoriert MERGE diese Einstellung.
Die MERGE-Anweisung erfordert ein Semikolon (;) als Anweisungsabschluss. Fehler 10713 wird ausgelöst, wenn eine MERGE-Anweisung ohne Abschlusszeichen ausgeführt wird.
Bei Verwendung nach MERGE gibt @@ ROWCOUNT (Transact-SQL) die Gesamtzahl der eingefügten, aktualisierten und gelöschten Zeilen an den Client zurück.
MERGE ist ein vollständig reserviertes Schlüsselwort, wenn die Datenbankkompatibilitätsstufe auf 100 oder höher festgelegt ist. Die MERGE-Anweisung ist sowohl unter 90 als auch unter 100 Datenbankkompatibilitätsstufen verfügbar. Das Schlüsselwort ist jedoch nicht vollständig reserviert, wenn die Datenbankkompatibilitätsstufe auf 90 festgelegt ist.
Verwenden Sie die MERGE-Anweisung nicht, wenn Sie die Replikationsreplikation in der Warteschlange verwenden. Der MERGE- und der Warteschlangen-Aktualisierungsauslöser sind nicht kompatibel. Ersetzen Sie die MERGE-Anweisung durch eine Einfügungs- oder Aktualisierungsanweisung.
Trigger-Implementierung
Für jede in angegebene Aktion zum Einfügen, Aktualisieren oder Löschen In der MERGE-Anweisung löst SQL Server alle entsprechenden AFTER-Trigger aus, die in der Zieltabelle definiert sind, garantiert jedoch nicht, für welche Aktion zuerst oder zuletzt Trigger ausgelöst werden sollen. Auslöser, die für dieselbe Aktion definiert wurden, berücksichtigen die von Ihnen angegebene Reihenfolge. Weitere Informationen zum Festlegen der Auslösereihenfolge für den Trigger finden Sie unter Angeben des ersten und des letzten Triggers.
Wenn in der Zieltabelle ein aktivierter INSTEAD OF-Trigger für eine von einer MERGE-Anweisung ausgeführte Aktion zum Einfügen, Aktualisieren oder Löschen definiert ist Es muss einen aktivierten INSTEAD OF-Trigger für alle in der MERGE-Anweisung angegebenen Aktionen haben.
Wenn in target_table INSTEAD OF UPDATE- oder INSTEAD OF DELETE-Trigger definiert sind, werden die Aktualisierungs- oder Löschvorgänge nicht ausgeführt Stattdessen werden die Trigger ausgelöst und die eingefügten und gelöschten Tabellen entsprechend ausgefüllt.
Wenn in target_table INSTEAD OF INSERT-Trigger definiert sind, wird die Einfügeoperation nicht ausgeführt. Stattdessen wird die Tabelle entsprechend gefüllt.
Berechtigungen
Erfordert die Berechtigung SELECT für die Quelltabelle und die Berechtigungen INSERT, UPDATE oder DELETE für die Zieltabelle. Weitere Informationen finden Sie im Abschnitt Berechtigungen in den Artikeln SELECT, INSERT, UPDATE und DELETE.
Optimieren der Leistung von MERGE-Anweisungen
Mithilfe der MERGE-Anweisung können Sie die einzelne DML ersetzen Anweisungen mit einer einzigen Anweisung. Dies kann die Abfrageleistung verbessern, da die Vorgänge innerhalb einer einzelnen Anweisung ausgeführt werden, wodurch die Häufigkeit der Verarbeitung der Daten in der Quell- und Zieltabelle minimiert wird. Leistungssteigerungen hängen jedoch davon ab, ob korrekte Indizes, Verknüpfungen und andere Überlegungen vorhanden sind.
Best Practices für Indizes
Um die Leistung der MERGE-Anweisung zu verbessern, empfehlen wir die folgenden Indexrichtlinien :
- Erstellen Sie einen Index für die Verknüpfungsspalten in der Quelltabelle, der eindeutig und umfassend ist.
- Erstellen Sie einen eindeutigen Clustered-Index für die Verknüpfungsspalten in der Zieltabelle.
Diese Indizes stellen sicher, dass die Verknüpfungsschlüssel eindeutig sind und die Daten in den Tabellen sortiert sind. Die Abfrageleistung wird verbessert, da das Abfrageoptimierungsprogramm keine zusätzliche Validierungsverarbeitung zum Auffinden und Aktualisieren doppelter Zeilen durchführen muss und keine zusätzlichen Sortiervorgänge erforderlich sind.
Best Practices beitreten
Zum Verbessern der Um die MERGE-Anweisung auszuführen und sicherzustellen, dass korrekte Ergebnisse erzielt werden, empfehlen wir die folgenden Join-Richtlinien:
- Geben Sie nur Suchbedingungen in ON < merge_search_condition > -Klausel, die die Kriterien für den Abgleich von Daten in der Quell- und Zieltabelle festlegt. Geben Sie also nur Spalten aus der Zieltabelle an, die mit den entsprechenden Spalten der Quelltabelle verglichen werden.
- Schließen Sie keine Vergleiche mit anderen Werten wie einer Konstanten ein.
Verwenden Sie eine der folgenden Methoden, um Zeilen aus den Quell- oder Zieltabellen herauszufiltern.
- Geben Sie die Suchbedingung für die Zeilenfilterung in der entsprechenden WHEN-Klausel an. Beispiel: WENN NICHT PASSEND UND S.EmployeeName WIE „S%“ DANN EINFÜGEN ….
- Definieren Sie eine Ansicht auf die Quelle oder das Ziel, die die gefilterten Zeilen zurückgibt, und verweisen Sie auf die Ansicht als Quelle oder Ziel Tabelle. Wenn die Ansicht in der Zieltabelle definiert ist, müssen alle Aktionen gegen sie die Bedingungen für die Aktualisierung von Ansichten erfüllen. Weitere Informationen zum Aktualisieren von Daten mithilfe einer Ansicht finden Sie unter Ändern von Daten über eine Ansicht.
- Verwenden Sie die Klausel
WITH <common table expression>
, um Zeilen aus den Quell- oder Zieltabellen herauszufiltern . Diese Methode ähnelt der Angabe zusätzlicher Suchkriterien in der ON-Klausel und kann zu falschen Ergebnissen führen. Wir empfehlen, diese Methode nicht zu verwenden oder gründlich zu testen, bevor Sie sie implementieren.
Die Verknüpfungsoperation in der MERGE-Anweisung wird auf dieselbe Weise wie eine Verknüpfung in einer SELECT-Anweisung optimiert. Das heißt, wenn SQL Server Verknüpfungen verarbeitet, wählt das Abfrageoptimierungsprogramm die effizienteste Methode (aus mehreren Möglichkeiten) zur Verarbeitung der Verknüpfung aus. Wenn Quelle und Ziel eine ähnliche Größe haben und die zuvor beschriebenen Indexrichtlinien auf die Quell- und Zieltabellen angewendet werden, ist ein Merge-Join-Operator der effizienteste Abfrageplan. Dies liegt daran, dass beide Tabellen einmal gescannt werden und die Daten nicht sortiert werden müssen. Wenn die Quelle kleiner als die Zieltabelle ist, ist ein Operator für verschachtelte Schleifen vorzuziehen.
Sie können die Verwendung eines bestimmten Joins erzwingen, indem Sie die Klausel OPTION (<query_hint>)
in angeben die MERGE-Anweisung. Wir empfehlen, den Hash-Join nicht als Abfragehinweis für MERGE-Anweisungen zu verwenden, da dieser Join-Typ keine Indizes verwendet.
Best Practices für die Parametrisierung
Wenn ein SELECT, INSERT, UPDATE Wenn die Anweisung DELETE ohne Parameter ausgeführt wird, kann der SQL Server-Abfrageoptimierer die Anweisung intern parametrisieren. Dies bedeutet, dass alle in der Abfrage enthaltenen Literalwerte durch Parameter ersetzt werden. Beispielsweise kann die Anweisung INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10) intern als INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2) implementiert werden. Dieser als einfache Parametrisierung bezeichnete Prozess erhöht die Fähigkeit der relationalen Engine, neue SQL-Anweisungen mit vorhandenen, zuvor kompilierten Ausführungsplänen abzugleichen. Die Abfrageleistung kann verbessert werden, da die Häufigkeit von Kompilierungen und Neukompilierungen von Abfragen verringert wird. Das Abfrageoptimierungsprogramm wendet den einfachen Parametrisierungsprozess nicht auf MERGE-Anweisungen an. Daher funktionieren MERGE-Anweisungen, die Literalwerte enthalten, möglicherweise nicht so gut wie einzelne INSERT-, UPDATE- oder DELETE-Anweisungen, da bei jeder Ausführung der MERGE-Anweisung ein neuer Plan erstellt wird.
Um die Abfrageleistung zu verbessern, empfehlen wir Die folgenden Richtlinien zur Parametrisierung:
- Parametrisieren Sie alle Literalwerte in der Klausel
ON <merge_search_condition>
und in der KlauselWHEN
Klauseln der MERGE-Anweisung. Beispielsweise können Sie die MERGE-Anweisung in eine gespeicherte Prozedur integrieren, indem Sie die Literalwerte durch entsprechende Eingabeparameter ersetzen. - Wenn Sie die Anweisung nicht parametrisieren können, erstellen Sie eine Plananleitung vom Typ
TEMPLATE
und geben Sie denPARAMETERIZATION FORCED
Abfragehinweis im Planhandbuch an. - Wenn MERGE-Anweisungen häufig in der Datenbank ausgeführt werden, sollten Sie die Option PARAMETERIZATION in der Datenbank festlegen Datenbank zu FORCED. Seien Sie vorsichtig, wenn Sie diese Option einstellen. Die Option
PARAMETERIZATION
ist eine Einstellung auf Datenbankebene und wirkt sich darauf aus, wie alle Abfragen für die Datenbank verarbeitet werden.
Best Practices für TOP-Klauseln
In der MERGE-Anweisung gibt die TOP-Klausel die Anzahl oder den Prozentsatz der Zeilen an, die betroffen sind, nachdem die Quelltabelle und die Zieltabelle verbunden wurden und nachdem Zeilen entfernt wurden, die sich nicht für eine Aktion zum Einfügen, Aktualisieren oder Löschen qualifizieren . Die TOP-Klausel reduziert die Anzahl der verknüpften Zeilen weiter auf den angegebenen Wert, und die Einfüge-, Aktualisierungs- oder Löschaktionen werden ungeordnet auf die verbleibenden verknüpften Zeilen angewendet. Das heißt, es gibt keine Reihenfolge, in der die Zeilen auf die in den WHEN-Klauseln definierten Aktionen verteilt werden. Die Angabe von TOP (10) wirkt sich beispielsweise auf 10 Zeilen aus. Von diesen Zeilen können 7 aktualisiert und 3 eingefügt oder 1 gelöscht, 5 aktualisiert und 4 eingefügt usw. werden.
Es ist üblich, die TOP-Klausel zu verwenden, um eine Datenmanipulationssprache (DML) durchzuführen ) Operationen an einer großen Tabelle in Chargen. Wenn Sie die TOP-Klausel in der MERGE-Anweisung für diesen Zweck verwenden, ist es wichtig, die folgenden Auswirkungen zu verstehen.
-
Die E / A-Leistung kann beeinträchtigt sein.
Die MERGE-Anweisung führt einen vollständigen Tabellenscan sowohl der Quell- als auch der Zieltabelle durch. Durch die Aufteilung des Vorgangs in Stapel wird die Anzahl der pro Stapel ausgeführten Schreibvorgänge verringert. Jeder Stapel führt jedoch einen vollständigen Tabellenscan der Quell- und Zieltabellen durch. Die resultierende Leseaktivität kann die Leistung der Abfrage beeinträchtigen.
-
Es können falsche Ergebnisse auftreten.
Es ist wichtig sicherzustellen, dass alle aufeinanderfolgenden Stapel auf neue Zeilen abzielen oder unerwünschtes Verhalten wie falsches Einfügen doppelter Zeilen in die Zieltabelle kann auftreten. Dies kann passieren, wenn die Quelltabelle eine Zeile enthält, die sich nicht in einem Zielstapel, sondern in der gesamten Zieltabelle befindet.
-
So stellen Sie korrekte Ergebnisse sicher:
- Verwenden Sie die ON-Klausel, um zu bestimmen, welche Quellzeilen vorhandene Zielzeilen beeinflussen und welche wirklich neu sind.
- Verwenden Sie eine zusätzliche Bedingung in der WHEN MATCHED-Klausel, um festzustellen, ob die Zielzeile bereits von aktualisiert wurde eine vorherige Charge.
Da die TOP-Klausel erst angewendet wird, nachdem diese Klauseln angewendet wurden, fügt jede Ausführung entweder eine wirklich nicht übereinstimmende Zeile ein oder aktualisiert eine vorhandene Zeile.
Best Practices für das Massenladen
Mit der MERGE-Anweisung können Daten aus einer Quelldatendatei effizient in eine Zieltabelle geladen werden, indem die Klausel OPENROWSET(BULK…)
angegeben wird als Tabellenquelle. Auf diese Weise wird die gesamte Datei in einem einzigen Stapel verarbeitet.
Um die Leistung des Massenzusammenführungsprozesses zu verbessern, empfehlen wir die folgenden Richtlinien:
-
Erstellen Sie einen Clustered-Index für die Join-Spalten in der Zieltabelle.
-
Verwenden Sie die Hinweise ORDER und UNIQUE in der Klausel
OPENROWSET(BULK…)
, um anzugeben Wie die Quelldatendatei sortiert ist.Standardmäßig geht die Massenoperation davon aus, dass die Datendatei ungeordnet ist. Daher ist es wichtig, dass die Quelldaten nach dem Clustered-Index in der Zieltabelle sortiert sind und dass der ORDER-Hinweis zur Angabe der Reihenfolge verwendet wird, damit der Abfrageoptimierer einen effizienteren Abfrageplan erstellen kann. Hinweise werden zur Laufzeit validiert; Wenn der Datenstrom nicht den angegebenen Hinweisen entspricht, wird ein Fehler ausgegeben.
Diese Richtlinien stellen sicher, dass die Verknüpfungsschlüssel eindeutig sind und die Sortierreihenfolge der Daten in der Quelldatei entspricht der Zieltabelle. Die Abfrageleistung wird verbessert, da keine zusätzlichen Sortiervorgänge erforderlich sind und keine unnötigen Datenkopien erforderlich sind.
Messen und Diagnostizieren der MERGE-Leistung
Die folgenden Funktionen unterstützen Sie beim Messen und Diagnostizieren die Leistung von MERGE-Anweisungen.
- Verwenden Sie den Merge-Stmt-Zähler in der dynamischen Verwaltungsansicht sys.dm_exec_query_optimizer_info, um die Anzahl der Abfrageoptimierungen für MERGE-Anweisungen zurückzugeben.
- Verwendung Das Attribut merge_action_type in der dynamischen Verwaltungsansicht sys.dm_exec_plan_attributes gibt den Typ des Trigger-Ausführungsplans zurück, der als Ergebnis einer MERGE-Anweisung verwendet wird.
- Verwenden Sie SQL Trace, um Fehlerbehebungsdaten für die MERGE-Anweisung auf dieselbe Weise zu erfassen Sie würden für andere DML-Anweisungen (Data Manipulation Language). Weitere Informationen finden Sie unter SQL-Ablaufverfolgung.
Beispiele
A. Verwenden von MERGE zum Ausführen von INSERT- und UPDATE-Operationen für eine Tabelle in einer einzelnen Anweisung
Ein häufiges Szenario besteht darin, eine oder mehrere Spalten in einer Tabelle zu aktualisieren, wenn eine übereinstimmende Zeile vorhanden ist. Oder Sie fügen die Daten als neue Zeile ein, wenn keine übereinstimmende Zeile vorhanden ist. In der Regel führen Sie beide Szenarien durch, indem Sie Parameter an eine gespeicherte Prozedur übergeben, die die entsprechenden Anweisungen UPDATE und INSERT enthält. Mit der Anweisung MERGE können Sie beide Aufgaben in ausführen Eine einzelne Anweisung. Das folgende Beispiel zeigt eine gespeicherte Prozedur in der AdventureWorks2012-Datenbank, die sowohl eine INSERT-Anweisung als auch eine UPDATE-Anweisung enthält. Die Prozedur wird dann so geändert, dass die entsprechenden Operationen mithilfe einer einzelnen MERGE-Anweisung ausgeführt werden.
B. Verwenden von MERGE zum Ausführen von UPDATE- und DELETE-Vorgängen für eine Tabelle in einer einzelnen Anweisung
Im folgenden Beispiel wird MERGE zum Aktualisieren der Tabelle ProductInventory
in der AdventureWorks2012-Beispieldatenbank verwendet. Täglich, basierend auf Bestellungen, die in der Tabelle SalesOrderDetail
verarbeitet werden. Die Spalte Quantity
der Spalte ProductInventory
-Tabelle wird aktualisiert, indem die Anzahl der Bestellungen pro Tag für jedes Produkt in der SalesOrderDetail
Tabelle. Wenn die Anzahl der Bestellungen für ein Produkt den Lagerbestand eines Produkts auf 0 oder weniger senkt, wird die Zeile für dieses Produkt aus der Tabelle ProductInventory
gelöscht.
C. Verwenden von MERGE zum Ausführen von UPDATE- und INSERT-Operationen für eine Zieltabelle mithilfe einer abgeleiteten Quelltabelle
Im folgenden Beispiel wird MERGE verwendet, um die Tabelle SalesReason
in der AdventureWorks2012-Datenbank zu ändern durch Aktualisieren oder Einfügen von Zeilen. Wenn der Wert von NewName
in der Quelltabelle mit einem Wert in der Spalte Name
der Zieltabelle übereinstimmt () wird die Spalte ReasonType
in der Zieltabelle aktualisiert. Wenn der Wert von NewName
nicht übereinstimmt, wird die Quellzeile in die Zieltabelle eingefügt. Die Quelltabelle ist eine abgeleitete Tabelle, die den Transact-SQL-Tabellenwertkonstruktor verwendet, um mehrere anzugeben Zeilen für die Quelltabelle. Weitere Informationen zur Verwendung des Tabellenwertkonstruktors in einer abgeleiteten Tabelle finden Sie unter Tabellenwertkonstruktor (Transact-SQL). Das Beispiel zeigt auch, wie die Ergebnisse der OUTPUT-Klausel in einer Tabellenvariablen gespeichert werden. Anschließend fassen Sie die Ergebnisse der MERGE-Anweisung zusammen, indem Sie eine einfache Auswahloperation ausführen, die die Anzahl der eingefügten und aktualisierten Zeilen zurückgibt.
D.Einfügen der Ergebnisse der MERGE-Anweisung in eine andere Tabelle
Im folgenden Beispiel werden Daten erfasst, die von der OUTPUT-Klausel einer MERGE-Anweisung zurückgegeben wurden, und diese Daten in eine andere Tabelle eingefügt. Die MERGE-Anweisung aktualisiert die Spalte Quantity
der Tabelle ProductInventory
in der AdventureWorks2012-Datenbank basierend auf Aufträgen, die in der SalesOrderDetail
. Das Beispiel erfasst die aktualisierten Zeilen und fügt sie in eine andere Tabelle ein, die zum Verfolgen von Inventaränderungen verwendet wird.
E. Verwenden von MERGE zum Einfügen oder Aktualisieren Eine Zielkantentabelle in einer Diagrammdatenbank
In diesem Beispiel erstellen Sie Knotentabellen Person
und City
und eine Kantentabelle livesIn
. Sie verwenden die Anweisung MERGE für die Kante livesIn
und fügen eine neue Zeile ein, wenn die Kante zwischen a noch nicht vorhanden ist Person
und City
. Wenn die Kante bereits vorhanden ist, aktualisieren Sie einfach das StreetAddress-Attribut an der livesIn
Kante.