- 20-08-2019
- 25 minuten om te lezen
-
- X
- c
- j
- r
- a
-
+18
Is van toepassing op: SQL Server (alle ondersteunde versies) Azure SQL Database Azure Synapse Analytics
Voert invoeg-, update- of verwijderbewerkingen uit op een doeltabel van de resultaten van een join met een brontabel. Synchroniseer bijvoorbeeld twee tabellen door rijen in de ene tabel in te voegen, bij te werken of te verwijderen op basis van verschillen in de andere tabel.
Opmerking
MERGE is momenteel in preview voor Azure Synapse Analytics.
Prestatietip: het voorwaardelijke gedrag dat wordt beschreven voor de MERGE-instructie, werkt het beste wanneer de twee tabellen een complexe combinatie van overeenkomende kenmerken hebben. U kunt bijvoorbeeld een rij invoegen als deze niet bestaat, of een rij bijwerken als deze overeenkomt. Wanneer u eenvoudig een tabel bijwerkt op basis van de rijen van een andere tabel, verbetert u de prestaties en schaalbaarheid met de basisinstructies INSERT, UPDATE en DELETE. voorbeeld:
Transact-SQL-syntaxisconventies
Syntaxis
Opmerking
Zie de documentatie van vorige versies om de Transact-SQL-syntaxis voor SQL Server 2014 en eerder te bekijken.
Argumenten
WITH < common_table_expression >
Specificeert de tijdelijke benoemde resultaatset of view, ook wel bekend als algemene tabelexpressie, die is gedefinieerd binnen het bereik van de MERGE-instructie. De resultatenset is afgeleid van een eenvoudige query en er wordt naar verwezen door de MERGE-instructie. Zie WITH common_table_expression (Transact-SQL) voor meer informatie.
TOP (expressie)
Specificeert het aantal of percentage van de betrokken rijen. expressie kan een getal of een percentage van de rijen zijn. De rijen waarnaar in de TOP-expressie wordt verwezen, zijn niet in een willekeurige volgorde gerangschikt. Zie TOP (Transact-SQL) voor meer informatie.
De TOP-clausule is van toepassing nadat de gehele brontabel en de gehele doeltabel zijn samengevoegd en de gekoppelde rijen die niet in aanmerking komen voor een invoeging, update of verwijderactie worden verwijderd. De TOP-clausule reduceert het aantal gekoppelde rijen verder tot de opgegeven waarde. De acties voor invoegen, bijwerken of verwijderen zijn ongeordend van toepassing op de resterende gekoppelde rijen. Dat wil zeggen, er is geen volgorde waarin de rijen worden verdeeld over de acties die zijn gedefinieerd in de WHEN-clausules. Als u bijvoorbeeld TOP (10) opgeeft, heeft dit invloed op 10 rijen. Van deze rijen kunnen er 7 worden bijgewerkt en 3 ingevoegd, of 1 kan worden verwijderd, 5 bijgewerkt en 4 ingevoegd, enzovoort.
Omdat de MERGE-instructie een volledige tabelscan uitvoert van zowel de bron als doeltabellen, worden de I / O-prestaties soms beïnvloed wanneer de TOP-clausule wordt gebruikt om een grote tabel te wijzigen door meerdere batches te maken. In dit scenario is het belangrijk om ervoor te zorgen dat alle opeenvolgende batches op nieuwe rijen zijn gericht.
databasenaam
De naam van de database waarin doel_tabel zich bevindt.
schema_naam
De naam van het schema waartoe target_table behoort.
target_table
De tabel of view waartegen de gegevensrijen van < table_source > worden vergeleken op basis van < clause_search_condition >. target_table is het doelwit van elke invoeg-, update- of verwijderbewerking gespecificeerd door de WHEN-clausules van de MERGE-instructie.
Als target_table een weergave is, moeten alle acties ertegen voldoen aan de voorwaarden voor het bijwerken van weergaven. Zie voor meer informatie Gegevens wijzigen door middel van een weergave.
target_table kan “geen externe tafel zijn. target_table kan “geen regels bevatten.
table_alias
Een alternatieve naam om te verwijzen naar een tabel voor de target_table.
USING < table_source >
Specificeert de gegevensbron die overeenkomt met de gegevensrijen in target_table op basis van < merge_search conditie >. Het resultaat van deze match dicteert de acties die moeten worden ondernomen door de WHEN-clausules van de MERGE-instructie. < table_source > kan een externe tabel zijn of een afgeleide tabel die toegang heeft tot externe tabellen.
< table_source > kan een afgeleide tabel zijn die de Transact-SQL-tabelwaardeconstructor gebruikt om een tabel samen te stellen door meerdere rijen op te geven.
table_alias
Een alternatieve naam om te verwijzen naar een tabel voor de table_source.
Zie FROM (Transact-SQL) voor meer informatie over de syntaxis en argumenten van deze clausule.
AAN < merge_search_condition >
Specificeert de voorwaarden waaronder < table_source > voegt zich bij target_table om te bepalen waar ze overeenkomen.
Let op
Het is belangrijk om alleen de kolommen uit de doeltabel die moeten worden gebruikt voor vergelijkingsdoeleinden. Dat wil zeggen: specificeer kolommen uit de doeltabel die worden vergeleken met de overeenkomstige kolom van de brontabel. Probeer de queryprestaties niet te verbeteren door rijen in de doeltabel uit te filteren in de ON-clausule; bijvoorbeeld door AND NOT target_table.column_x = value
op te geven. Dit kan onverwachte en onjuiste resultaten opleveren.
WANNEER GELIJK DAN < merge_matched >
Specificeert dat alle rijen van * target_table, die overeenkomen met de rijen geretourneerd door < table_source > AAN < merge_search_condition >, en voldoen aan alle aanvullende zoekvoorwaarden, worden bijgewerkt of verwijderd volgens de < merge_matched > -clausule.
De MERGE-instructie kan maximaal twee WHEN MATCHED-clausules hebben. Als er twee clausules zijn gespecificeerd, moet de eerste clausule vergezeld gaan van een AND < search_condition > clausule. Voor een bepaalde rij wordt de tweede WHEN MATCHED-clausule alleen toegepast als de eerste niet “t is. Als er twee WHEN MATCHED-clausules zijn, moet één een UPDATE-actie specificeren en moet één een DELETE-actie specificeren. Wanneer UPDATE is gespecificeerd in de < merge_matched > clausule, en meer dan één rij < table_source > komt overeen met een rij in target_table op basis van < merge_search_condition >, SQL Server retourneert een fout. De MERGE-instructie kan” t werk dezelfde rij meer dan eens bij, of werk en verwijder dezelfde rij.
WANNEER NIET GELIJK DAN < merge_not_matched >
Specificeert dat een rij wordt ingevoegd in target_table voor elke rij die wordt geretourneerd door < table_source > AAN < merge_search_condition > die niet overeenkomt met een rij in targ et_table, maar voldoet aan een aanvullende zoekvoorwaarde, indien aanwezig. De in te voegen waarden worden gespecificeerd door de < merge_not_matched > -clausule. De MERGE-instructie kan slechts één WHEN NOT MATCHED-clausule bevatten.
WHEN NOT MATCHED BY SOURCE THEN < merge_matched >
Specificeert dat alle rijen van * target_table, die “niet overeenkomen met de rijen die worden geretourneerd door < table_source > AAN < merge_search_condition >, en die voldoen aan eventuele aanvullende zoekvoorwaarden, worden bijgewerkt of verwijderd volgens de < merge_matched > clausule.
De MERGE-instructie kan maximaal twee WHEN NOT MATCHED BY SOURCE-clausules bevatten. Als er twee clausules zijn gespecificeerd, moet de eerste clausule vergezeld gaan van een AND < clause_search_condition > -clausule. Voor elke rij wordt de tweede WHEN NOT MATCHED BY SOURCE-clausule alleen toegepast als de eerste isn ” t. Als er twee WHEN NOT MATCHED BY SOURCE-clausules zijn, moet één een UPDATE-actie specificeren en één moet een DELETE-actie specificeren. Alleen kolommen uit de doeltabel kunnen worden verwezen in < clause_search_condition >.
Wanneer er geen rijen worden geretourneerd door < table_source >, kolommen in de brontabel “niet toegankelijk. Als de update- of verwijderactie gespecificeerd in de < merge_matched > -clausule verwijst naar kolommen in de brontabel, fout 207 (ongeldige kolomnaam) wordt geretourneerd. De clausule WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1
kan ervoor zorgen dat de instructie mislukt omdat Col1
in de brontabel niet toegankelijk is.
EN < clause_search_condition >
Specificeert een geldige zoekvoorwaarde. Zie Zoekvoorwaarde (Transact-SQL) voor meer informatie.
< table_hint_limited >
Specificeert een of meer tabelhints die op de doeltabel moeten worden toegepast voor elk van de e acties invoegen, bijwerken of verwijderen die worden uitgevoerd door de MERGE-instructie. Het WITH-sleutelwoord en de haakjes zijn vereist.
NOLOCK en READUNCOMMITTED zijn niet toegestaan. Voor meer informatie over tabelhints, zie Tabelhints (Transact-SQL).
Het specificeren van de TABLOCK-hint op een tabel die het doel is van een INSERT-instructie heeft hetzelfde effect als het specificeren van de TABLOCKX-hint. Er wordt een exclusieve vergrendeling toegepast op de tabel. Wanneer FORCESEEK is gespecificeerd, is dit van toepassing op de impliciete instantie van de doeltabel die is samengevoegd met de brontabel.
Let op
Het specificeren van READPAST met WHEN NOT MATCHED THEN INSERT kan resulteren in INSERT-bewerkingen die UNIEKE beperkingen schenden.
INDEX (index_val)
Specificeert de naam of ID van een of meer indexen op de doeltabel voor het uitvoeren van een impliciete join met de brontabel. Voor meer informatie, zie Tabelhints (Transact -SQL).
< output_clause >
Retourneert een rij voor elke rij in target_table die bijgewerkt, ingevoegd of verwijderd, in willekeurige volgorde. $ action kan worden gespecificeerd in de output clausule. $ action is een kolom van het type nvarchar (10) die een van de drie waarden voor elke rij retourneert: “INSERT”, “UPDATE” of “DELETE”, afhankelijk van de actie die op die rij is uitgevoerd. Zie OUTPUT-clausule (Transact-SQL) voor meer informatie over de argumenten en het gedrag van deze clausule.
< merge_matched >
Specificeert de update- of verwijderactie die wordt toegepast op alle rijen van target_table die niet “overeenkomen met de rijen die worden geretourneerd door < table_source > AAN < merge_search_condition >, en die voldoen aan alle aanvullende zoekvoorwaarden.
UPDATE SET < set_clause >
Specificeert de lijst met kolom- of variabelenamen die moeten worden bijgewerkt in de doeltabel en de waarden waarmee ze moeten worden bijgewerkt.
Zie UPDATE (Transact-SQL) voor meer informatie over de argumenten van deze clausule. Het instellen van een variabele op dezelfde waarde als een kolom wordt niet ondersteund.
DELETE
Specificeert dat de rijen die overeenkomen met rijen in target_table worden verwijderd.
< merge_not_matched >
Specificeert de waarden die in de doeltabel moeten worden ingevoegd.
(column_list)
Een lijst van één of meer kolommen van de doeltabel waarin gegevens worden ingevoegd. Kolommen moeten worden gespecificeerd als een enkelvoudige naam, anders mislukt de MERGE-instructie. column_list moet tussen haakjes staan en worden gescheiden door kommas.
VALUES ( waardenlijst)
Een door kommas gescheiden lijst van constanten, variabelen of uitdrukkingen die waarden retourneren om in de doeltabel in te voegen. Uitdrukkingen mogen “geen EXECUTE-instructie bevatten.
DEFAULT VALUES
Forceert de ingevoegde rij om de standaardwaarden te bevatten die voor elke kolom zijn gedefinieerd.
Zie INSERT (Transact-SQL) voor meer informatie over deze clausule.
< search_condition >
Speci fies de zoekvoorwaarden om < merge_search_condition > of < clausule_search_condition . Zie Zoekvoorwaarde (Transact-SQL) voor meer informatie over de argumenten voor deze clausule.
< grafiekzoekpatroon >
Specificeert het overeenkomstpatroon van de grafiek. Voor meer informatie over de argumenten voor deze clausule, zie MATCH (Transact-SQL)
Opmerkingen
Opmerking
In Azure Synapse Analytics, de MERGE command (preview) heeft de volgende verschillen in vergelijking met SQL-server en Azure SQL-database.
- Een MERGE-update wordt geïmplementeerd als een delete en insert-paar. Het getroffen aantal rijen voor een MERGE-update omvat de verwijderde en ingevoegde rijen.
- Tijdens de preview worden tabellen met identiteitskolom niet ondersteund door de Synapse SQL MERGE-opdracht.
- De ondersteuning voor tabellen met verschillende distributietypes worden in deze tabel beschreven:
CLAUSULE SAMENVOEGEN in Azure Synapse Analytics Ondersteunde TARGE-distributietabel Ondersteunde SOURCE-distributietabel Commentaar WANNEER OVEREENKOMSTIG Alle distributietypes Alle distributietypes NIET GEKOPPELD DOOR DOEL HASH Alle distributietypes Gebruik UPDATE / DELETE FROM… JOIN om twee tabellen te synchroniseren. NIET OVEREENKOMEN DOOR BRON Alle distributietypes Alle distributietypes
Ten minste één van de drie MATCHED-clausules moet worden gespecificeerd, maar ze kunnen in elke volgorde worden gespecificeerd. Een variabele kan niet meer dan één keer worden bijgewerkt in dezelfde MATCHED-clausule.
Elke invoeg-, update- of verwijderactie die is gespecificeerd in de doeltabel door de MERGE-instructie, wordt beperkt door alle beperkingen die erop zijn gedefinieerd, inclusief eventuele trapsgewijze referentiële integriteitsbeperkingen. Als IGNORE_DUP_KEY AAN is voor unieke indexen op de doeltabel, negeert MERGE deze instelling.
De MERGE-instructie vereist een puntkomma (;) als een instructie-terminator. Fout 10713 treedt op wanneer een MERGE-instructie wordt uitgevoerd zonder de terminator.
Wanneer gebruikt na MERGE, retourneert @@ ROWCOUNT (Transact-SQL) het totale aantal rijen dat is ingevoegd, bijgewerkt en verwijderd naar de client.
MERGE is een volledig gereserveerd trefwoord wanneer het compatibiliteitsniveau van de database is ingesteld op 100 of hoger. De MERGE-instructie is beschikbaar onder zowel 90 als 100 databasecompatibiliteitsniveaus; Het sleutelwoord is echter niet volledig gereserveerd als het compatibiliteitsniveau van de database is ingesteld op 90.
Gebruik de instructie MERGE niet wanneer u replicatie in de wachtrij gebruikt. De MERGE-trigger en de update-trigger in de wachtrij zijn niet compatibel. Vervang de MERGE-instructie door een insert- of update-instructie.
Triggerimplementatie
Voor elke invoeg-, update- of verwijderactie gespecificeerd in de MERGE-instructie, activeert SQL Server alle corresponderende AFTER-triggers die zijn gedefinieerd in de doeltabel, maar kan niet garanderen op welke actie de triggers als eerste of als laatste moeten worden geactiveerd. Triggers die voor dezelfde actie zijn gedefinieerd, respecteren de volgorde die u opgeeft. Voor meer informatie over het instellen van trigger-activeringsvolgorde, zie Specify First and Last Triggers.
Als de doeltabel een geactiveerde INSTEAD OF-trigger heeft gedefinieerd voor een invoeg-, update- of verwijderactie die wordt uitgevoerd door een MERGE-instructie , moet het een geactiveerde INSTEAD OF-trigger hebben voor alle acties die zijn gespecificeerd in de MERGE-instructie.
Als er INSTEAD OF UPDATE- of INSTEAD OF DELETE-triggers zijn gedefinieerd op target_table, zijn de update- of verwijderbewerkingen niet uitvoeren. In plaats daarvan worden de triggers geactiveerd en worden de ingevoegde en verwijderde tabellen overeenkomstig ingevuld.
Als er in plaats van INSERT-triggers zijn gedefinieerd op target_table, wordt de invoegbewerking niet uitgevoerd. In plaats daarvan wordt de tabel dienovereenkomstig gevuld.
Rechten
Vereist SELECT-toestemming voor de brontabel en INSERT-, UPDATE- of DELETE-rechten voor de doeltabel. Zie voor meer informatie de sectie Machtigingen in de artikelen SELECT, INSERT, UPDATE en DELETE.
Prestaties van MERGE-verklaring optimaliseren
Door de instructie MERGE te gebruiken, kunt u de individuele DML vervangen uitspraken met een enkele uitspraak. Dit kan de prestaties van de query verbeteren omdat de bewerkingen binnen één instructie worden uitgevoerd, waardoor het aantal keren dat de gegevens in de bron- en doeltabellen worden verwerkt, tot een minimum wordt beperkt. Prestatieverbeteringen zijn echter afhankelijk van het hebben van de juiste indexen, joins en andere overwegingen.
Best practices voor indexen
Om de prestaties van de MERGE-instructie te verbeteren, raden we de volgende indexrichtlijnen aan :
- Maak een index op de join-kolommen in de brontabel die uniek en dekkend is.
- Maak een unieke geclusterde index op de join-kolommen in de doeltabel.
Deze indexen zorgen ervoor dat de join-sleutels uniek zijn en dat de gegevens in de tabellen worden gesorteerd. Queryprestaties zijn verbeterd omdat de query-optimalisatie geen extra validatieverwerking hoeft uit te voeren om dubbele rijen te lokaliseren en bij te werken en aanvullende sorteerbewerkingen niet nodig zijn.
JOIN Best Practices
Om de prestaties van de MERGE-instructie en ervoor zorgen dat de juiste resultaten worden verkregen, raden we de volgende richtlijnen voor join aan:
- Specificeer alleen zoekvoorwaarden in de ON < merge_search_condition > clausule die de criteria bepaalt voor het matchen van gegevens in de bron- en doeltabellen. Dat wil zeggen, specificeer alleen kolommen uit de doeltabel die worden vergeleken met de overeenkomstige kolommen van de brontabel.
- Neem geen vergelijkingen op met andere waarden, zoals een constante.
Gebruik een van de volgende methoden om rijen uit de bron- of doeltabellen te filteren.
- Specificeer de zoekvoorwaarde voor het filteren van rijen in de juiste WHEN-component. Bijvoorbeeld, WANNEER NIET OVEREENKOMEN EN S.EmployeeName LIKE “S%” DAN INSERT ….
- Definieer een weergave van de bron of het doel dat de gefilterde rijen retourneert en verwijs naar de weergave als de bron of het doel tafel. Als de weergave is gedefinieerd op de doeltabel, moeten alle acties ertegen voldoen aan de voorwaarden voor het bijwerken van weergaven. Voor meer informatie over het bijwerken van gegevens met behulp van een weergave, zie Gegevens wijzigen via een weergave.
- Gebruik de
WITH <common table expression>
-clausule om rijen uit de bron- of doeltabellen te filteren . Deze methode is vergelijkbaar met het specificeren van aanvullende zoekcriteria in de ON-clausule en kan onjuiste resultaten opleveren. We raden u aan deze methode te vermijden of grondig te testen voordat u deze implementeert.
De join-bewerking in de MERGE-instructie wordt op dezelfde manier geoptimaliseerd als een join in een SELECT-instructie. Dat wil zeggen, wanneer SQL Server joins verwerkt, kiest de query-optimizer de meest efficiënte methode (uit verschillende mogelijkheden) om de join te verwerken. Wanneer de bron en het doel van vergelijkbare grootte zijn en de eerder beschreven indexrichtlijnen worden toegepast op de bron- en doeltabellen, is een samenvoegingsoperator het meest efficiënte queryplan. Dit komt doordat beide tabellen één keer worden gescand en het is niet nodig om de gegevens te sorteren. Als de bron kleiner is dan de doeltabel, heeft een operator voor geneste lussen de voorkeur.
U kunt het gebruik van een specifieke join afdwingen door de OPTION (<query_hint>)
-clausule in de MERGE-verklaring. We raden u aan de hash-join niet te gebruiken als een queryhint voor MERGE-instructies, omdat dit join-type geen indexen gebruikt.
Aanbevolen procedures voor parametrering
Als een SELECT, INSERT, UPDATE , of DELETE-instructie wordt uitgevoerd zonder parameters, kan de SQL Server-queryoptimalisatie ervoor kiezen om de instructie intern te parametreren. Dit betekent dat alle letterlijke waarden die in de query zijn opgenomen, worden vervangen door parameters. De instructie INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), kan bijvoorbeeld intern worden geïmplementeerd als INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Dit proces, eenvoudige parametrisering genoemd, vergroot het vermogen van de relationele engine om nieuwe SQL-instructies te matchen met bestaande, eerder gecompileerde uitvoeringsplannen. Queryprestaties kunnen worden verbeterd omdat de frequentie van het compileren en opnieuw compileren van querys wordt verminderd. De Query Optimizer past het eenvoudige parameterisatieproces niet toe op MERGE-instructies. Daarom presteren MERGE-instructies die letterlijke waarden bevatten mogelijk niet zo goed als individuele INSERT-, UPDATE- of DELETE-instructies, omdat een nieuw plan wordt gecompileerd telkens wanneer de MERGE-instructie wordt uitgevoerd.
Om de queryprestaties te verbeteren, raden we aan de volgende richtlijnen voor parametrering:
- Parametreer alle letterlijke waarden in de
ON <merge_search_condition>
-clausule en in deWHEN
clausules van de MERGE-instructie. U kunt bijvoorbeeld de instructie MERGE opnemen in een opgeslagen procedure en de letterlijke waarden vervangen door de juiste invoerparameters. - Als u de instructie niet kunt parametriseren, maakt u een planrichtlijn van het type
TEMPLATE
en specificeer dePARAMETERIZATION FORCED
vraaghint in de planhandleiding. - Als MERGE-instructies regelmatig worden uitgevoerd in de database, overweeg dan om de optie PARAMETERIZATION in te stellen op de database naar FORCED. Wees voorzichtig bij het instellen van deze optie. De
PARAMETERIZATION
-optie is een instelling op databaseniveau en bepaalt hoe alle querys tegen de database worden verwerkt.
Best Practices in de TOP-clausule
In de MERGE-instructie specificeert de TOP-clausule het aantal of percentage rijen dat wordt beïnvloed nadat de brontabel en de doeltabel zijn samengevoegd, en nadat rijen die niet in aanmerking komen voor een invoeg-, update- of verwijderactie zijn verwijderd . De TOP-clausule reduceert het aantal gekoppelde rijen verder tot de opgegeven waarde en de acties voor invoegen, bijwerken of verwijderen worden op de resterende samengevoegde rijen op een ongeordende manier toegepast. Dat wil zeggen, er is geen volgorde waarin de rijen worden verdeeld over de acties die zijn gedefinieerd in de WHEN-clausules. Als u bijvoorbeeld TOP (10) opgeeft, heeft dit invloed op 10 rijen; van deze rijen kunnen er 7 worden bijgewerkt en 3 ingevoegd, of 1 kan worden verwijderd, 5 bijgewerkt en 4 ingevoegd, enzovoort.
Het is gebruikelijk om de TOP-clausule te gebruiken om gegevensmanipulatie uit te voeren (DML ) bewerkingen op een grote tafel in batches. Wanneer u de TOP-clausule in de MERGE-instructie voor dit doel gebruikt, is het belangrijk om de volgende implicaties te begrijpen.
-
De I / O-prestaties kunnen worden beïnvloed.
De MERGE-instructie voert een volledige tabelscan uit van zowel de bron- als de doeltabellen. Door de bewerking in batches te verdelen, wordt het aantal schrijfbewerkingen dat per batch wordt uitgevoerd, verminderd; Elke batch zal echter een volledige tabelscan van de bron- en doeltabellen uitvoeren. De resulterende leesactiviteit kan de prestaties van de zoekopdracht beïnvloeden.
-
Er kunnen onjuiste resultaten optreden.
Het is belangrijk om ervoor te zorgen dat alle opeenvolgende batches op nieuwe rijen zijn gericht. of ongewenst gedrag, zoals het onjuist invoegen van dubbele rijen in de doeltabel, kan voorkomen. Dit kan gebeuren wanneer de brontabel een rij bevat die niet in een doelbatch was maar in de algehele doeltabel.
-
Om correcte resultaten te verzekeren:
- Gebruik de ON-clausule om te bepalen welke bronrijen van invloed zijn op bestaande doelrijen en welke echt nieuw zijn.
- Gebruik een aanvullende voorwaarde in de WHEN MATCHED-clausule om te bepalen of de doelrij al is bijgewerkt door een eerdere batch.
Omdat de TOP-clausule pas wordt toegepast nadat deze clausules zijn toegepast, voegt elke uitvoering een echt ongeëvenaarde rij in of werkt een bestaande rij bij.
Best Practices voor bulksgewijs laden
De MERGE-instructie kan worden gebruikt om efficiënt gegevens van een brongegevensbestand in een doeltabel te laden door de OPENROWSET(BULK…)
-clausule op te geven als de tabelbron. Door dit te doen, wordt het volledige bestand in één batch verwerkt.
Om de prestaties van het bulk-samenvoegingsproces te verbeteren, raden we de volgende richtlijnen aan:
-
Maak een geclusterde index op de join-kolommen in de doeltabel.
-
Gebruik de ORDER- en UNIQUE-hints in de
OPENROWSET(BULK…)
-clausule om te specificeren hoe het brongegevensbestand is gesorteerd.Standaard gaat de bulkbewerking ervan uit dat het gegevensbestand ongeordend is. Daarom is het belangrijk dat de brongegevens worden gesorteerd volgens de geclusterde index op de doeltabel en dat de ORDER-hint wordt gebruikt om de volgorde aan te geven, zodat de query-optimizer een efficiënter queryplan kan genereren. Hints worden gevalideerd tijdens runtime; als de datastroom niet voldoet aan de gespecificeerde hints, wordt er een fout gegenereerd.
Deze richtlijnen zorgen ervoor dat de join-sleutels uniek zijn en de sorteervolgorde van de data in de bronbestand komt overeen met de doeltabel. Queryprestaties zijn verbeterd omdat aanvullende sorteerbewerkingen niet nodig zijn en onnodige gegevenskopieën niet nodig zijn.
MERGE-prestaties meten en diagnosticeren
De volgende functies zijn beschikbaar om u te helpen bij het meten en diagnosticeren de prestaties van MERGE-statements.
- Gebruik de merge stmt-teller in de sys.dm_exec_query_optimizer_info dynamische beheerweergave om het aantal query-optimalisaties te retourneren dat voor MERGE-statements is.
- Gebruik het merge_action_type attribuut in de sys.dm_exec_plan_attributes dynamische beheerweergave om het type triggeruitvoeringsplan te retourneren dat wordt gebruikt als het resultaat van een MERGE-instructie.
- Gebruik SQL Trace om op dezelfde manier probleemoplossingsgegevens voor de MERGE-instructie te verzamelen u zou voor andere data manipulation language (DML) statements. Zie SQL Trace voor meer informatie.
Voorbeelden
A. MERGE gebruiken om INSERT- en UPDATE-bewerkingen op een tabel uit te voeren in een enkele instructie
Een veelvoorkomend scenario is het bijwerken van een of meer kolommen in een tabel als er een overeenkomende rij bestaat. Of door de gegevens als een nieuwe rij in te voegen als er geen overeenkomende rij bestaat. U doet meestal beide scenarios door parameters door te geven aan een opgeslagen procedure die de juiste UPDATE- en INSERT-instructies bevat. Met de MERGE-instructie kunt u beide taken uitvoeren in een enkele instructie. Het volgende voorbeeld toont een opgeslagen procedure in de AdventureWorks2012database die zowel een INSERT-instructie als een UPDATE-instructie bevat. De procedure wordt vervolgens aangepast om de equivalente bewerkingen uit te voeren met behulp van een enkele MERGE-instructie.
B . MERGE gebruiken om UPDATE- en DELETE-bewerkingen op een tabel uit te voeren in een enkele instructie
In het volgende voorbeeld wordt MERGE gebruikt om de ProductInventory
-tabel in de AdventureWorks2012-voorbeelddatabase bij te werken, dagelijks, op basis van bestellingen die worden verwerkt in de SalesOrderDetail
-tabel. De Quantity
-kolom van de ProductInventory
tabel wordt bijgewerkt door het aantal bestellingen dat elke dag voor elk product in de SalesOrderDetail
tabel. Als het aantal bestellingen voor een product het voorraadniveau van een product tot 0 of minder daalt, wordt de rij voor dat product verwijderd uit de tabel ProductInventory
.
C. MERGE gebruiken om UPDATE- en INSERT-bewerkingen uit te voeren op een doeltabel met behulp van een afgeleide brontabel
In het volgende voorbeeld wordt MERGE gebruikt om de SalesReason
-tabel in de AdventureWorks2012-database te wijzigen door rijen bij te werken of in te voegen. Wanneer de waarde van NewName
in de brontabel overeenkomt met een waarde in de Name
kolom van de doeltabel, (SalesReason
), wordt de ReasonType
kolom bijgewerkt in de doeltabel. Wanneer de waarde van NewName
niet “overeenkomt, wordt de bronrij ingevoegd in de doeltabel. De brontabel is een afgeleide tabel die de Transact-SQL-tabelwaardeconstructor gebruikt om meerdere rijen voor de brontabel. Zie Tabelwaardeconstructor (Transact-SQL) voor meer informatie over het gebruik van de tabelwaardeconstructor in een afgeleide tabel. Het voorbeeld laat ook zien hoe de resultaten van de OUTPUT-clausule in een tabelvariabele kunnen worden opgeslagen. En, Vervolgens vat je de resultaten van de MERGE-instructie samen door een eenvoudige selectiebewerking uit te voeren die het aantal ingevoegde en bijgewerkte rijen retourneert.
D.De resultaten van de MERGE-instructie in een andere tabel invoegen
In het volgende voorbeeld worden gegevens vastgelegd die zijn geretourneerd door de OUTPUT-clausule van een MERGE-instructie en worden die gegevens in een andere tabel ingevoegd. De MERGE-instructie werkt de Quantity
-kolom van de ProductInventory
-tabel in de AdventureWorks2012-database bij, op basis van bestellingen die worden verwerkt in de SalesOrderDetail
tabel. Het voorbeeld legt de bijgewerkte rijen vast en voegt ze in een andere tabel in die wordt gebruikt om voorraadwijzigingen bij te houden.
E. MERGE gebruiken om INSERT of UPDATE uit te voeren op een doelrandtabel in een grafiekdatabase
In dit voorbeeld maakt u knooppunttabellen Person
en City
en een edge table livesIn
. U gebruikt de MERGE-instructie op de livesIn
-rand en voegt een nieuwe rij in als de rand niet al bestaat tussen een Person
en City
. Als de edge al bestaat, werk je het StreetAddress-attribuut op de livesIn
edge bij.