- 20.08.2019
- 25 de minute de citit
-
- X
- c
- j
- r
- a
-
+18
Se aplică la: SQL Server (toate versiunile acceptate) Azure SQL Database Azure Synapse Analytics
Rulează operațiile de inserare, actualizare sau ștergere pe un tabel țintă din rezultatele unei asocieri cu un tabel sursă. De exemplu, sincronizați două tabele inserând, actualizând sau ștergând rânduri într-un tabel pe baza diferențelor găsite în celălalt tabel.
Notă
MERGE este în prezent în previzualizare pentru Azure Synapse Analytics.
Sfat privind performanța: comportamentul condițional descris pentru instrucțiunea MERGE funcționează cel mai bine atunci când cele două tabele au un amestec complex de caracteristici potrivite. De exemplu, inserarea unui rând dacă nu există sau actualizarea unui rând dacă se potrivește. Când pur și simplu actualizați un tabel pe baza rândurilor unui alt tabel, îmbunătățiți performanța și scalabilitatea cu instrucțiunile de bază INSERT, UPDATE și DELETE. exemplu:
Convenții de sintaxă Transact-SQL
Sintaxă
Notă
Pentru a vizualiza sintaxa Transact-SQL pentru SQL Server 2014 și versiunile anterioare, consultați documentația versiunilor anterioare.
Argumente
CU < common_table_expression >
Specifică setul de rezultate sau vizualizarea denumită temporar, cunoscută și sub numele de expresie de tabel comună, care este definită în cadrul declarației MERGE. Setul de rezultate derivă dintr-o interogare simplă și este menționat de declarația MERGE. Pentru mai multe informații, consultați CU common_table_expression (Transact-SQL).
TOP (expresie)
Specifică numărul sau procentul rândurilor afectate. expresia poate fi fie un număr, fie un procent din rânduri. Rândurile la care se face referire în expresia TOP nu sunt aranjate în nici o ordine. Pentru mai multe informații, consultați TOP (Transact-SQL).
Clauza TOP se aplică după întreaga tabelă sursă și întreaga tabelă țintă alăturată și rândurile unite care nu se califică pentru inserare, actualizare sau acțiunea de ștergere este eliminată. Clauza TOP reduce și mai mult numărul de rânduri unite la valoarea specificată. Acțiunile de inserare, actualizare sau ștergere se aplică rândurilor rămase unite într-un mod neordonat. Adică nu există nicio ordine în care rândurile sunt distribuite între acțiunile definite în clauzele WHEN. De exemplu, specificarea TOP (10) afectează 10 rânduri. Dintre aceste rânduri, 7 pot fi actualizate și 3 inserate, sau 1 pot fi șterse, 5 actualizate și 4 inserate și așa mai departe.
Deoarece instrucțiunea MERGE efectuează o scanare completă a tabelului atât a sursei cât și a sursei tabelele țintă, performanța I / O este uneori afectată atunci când se utilizează clauza TOP pentru a modifica un tabel mare prin crearea mai multor loturi. În acest scenariu, este important să vă asigurați că toate loturile succesive vizează rânduri noi.
database_name
Numele bazei de date în care se află target_table.
schema_name
Numele schemei căreia îi aparține target_table.
target_table
Tabelul sau vizualizarea împotriva cărora rândurile de date din < table_source > sunt potrivite pe baza < clause_search_condition >. target_table este ținta oricărei operații de inserare, actualizare sau ștergere specificat de clauzele WHEN din declarația MERGE.
Dacă target_table este o vizualizare, orice acțiune împotriva acesteia trebuie să îndeplinească condițiile pentru actualizarea vizualizărilor. Pentru mai multe informații, consultați Modificarea datelor printr-o vizualizare.
target_table nu poate fi o masă la distanță. target_table nu poate avea reguli definite pe acesta.
table_alias
Un nume alternativ pentru a face referință la un tabel pentru target_table.
UTILIZARE < table_source >
Specifică sursa de date care se potrivește cu rândurile de date din target_table pe baza < condiția merge_search >. Rezultatul acestui meci dictează acțiunile de întreprins prin clauzele WHEN din declarația MERGE. < table_source > poate fi un tabel la distanță sau un tabel derivat care accesează tabelele la distanță.
< table_source > poate fi un tabel derivat care utilizează constructorul valorii tabelelor Transact-SQL pentru a construi un tabel prin specificarea mai multor rânduri.
table_alias
Un nume alternativ pentru a face referință la un tabel pentru table_source.
Pentru mai multe informații despre sintaxa și argumentele acestei clauze, consultați FROM (Transact-SQL).
ON < merge_search_condition >
Specifică condițiile în care < table_source > se alătură cu target_table pentru a determina unde se potrivesc.
Atenție
Este important să specificați numai coloanele din tabelul țintă pentru a le utiliza în scopuri potrivite. Adică, specificați coloanele din tabelul țintă care sunt comparate cu coloana corespunzătoare a tabelului sursă. Nu încercați să îmbunătățiți performanța interogării filtrând rândurile din tabelul țintă în clauza ON; de exemplu, cum ar fi specificarea AND NOT target_table.column_x = value
. Dacă faceți acest lucru, puteți obține rezultate neașteptate și incorecte.
CÂND SE APAREAZĂ ATUNCI < merge_matched >
Specifică faptul că toate rândurile din * target_table, care se potrivesc cu rândurile returnate de < table_source > ON < merge_search_condition > și îndeplinesc orice condiție de căutare suplimentară, fie sunt actualizate, fie șterse conform < merge_matched > clauză.
Instrucțiunea MERGE poate avea cel mult două clauze WHEN MATCHED. Dacă sunt specificate două clauze, prima clauză trebuie să fie însoțită de o clauză AND < search_condition >. Pentru orice rând dat, a doua clauză WHEN MATCHED se aplică numai dacă prima nu este „t. Dacă există două clauze WHEN MATCHED, trebuie specificată o acțiune UPDATE și trebuie specificată o acțiune DELETE. Când UPDATE este specificat în < merge_matched > clauză și mai mult de un rând din < table_source > corespunde unui rând din target_table bazat pe < merge_search_condition >, SQL Server returnează o eroare. Instrucțiunea MERGE poate” nu actualizați același rând de mai multe ori sau actualizați și ștergeți același rând.
CÂND NU SE COPORTEZĂ < merge_not_matched >
Specifică faptul că un rând este inserat în target_table pentru fiecare rând returnat de < table_source > ON < merge_search_condition > care nu se potrivește cu un rând din targ et_table, dar îndeplinește o condiție de căutare suplimentară, dacă este prezentă. Valorile de inserat sunt specificate prin clauza < merge_not_matched >. Instrucțiunea MERGE poate avea o singură clauză WHEN NOT MATCHED.
WHEN NOT MATCHED OF SOURCE THEN < merge_matched >
Specifică faptul că toate rândurile din * target_table, care nu se potrivesc cu rândurile returnate de < table_source > ON < merge_search_condition > și care îndeplinesc orice condiție suplimentară de căutare, sunt actualizate sau șterse conform < merge_matched > clauză.
Instrucțiunea MERGE poate avea cel mult două clauze WHEN NOT MATCHED BY SOURCE. Dacă sunt specificate două clauze, atunci prima clauză trebuie să fie însoțită de o clauză AND < clause_search_condition >. Pentru orice rând dat, a doua clauză WHEN NOT MATCHED BY SOURCE se aplică numai dacă prima nu este ” t. Dacă există două clauze WHEN NOT MATCHED BY SOURCE, atunci trebuie specificată o acțiune UPDATE și trebuie specificată o acțiune DELETE. Numai coloanele din tabelul țintă pot fi menționate în < clause_search_condition >.
Când nu sunt returnate rânduri de < table_source >, coloanele din tabelul sursă „nu pot fi accesate. Dacă acțiunea de actualizare sau ștergere specificată în < merge_matched > clauză face referință la coloane în tabelul sursă, se returnează eroarea 207 (nume nevalid al coloanei). De exemplu, clauza WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1
poate face ca declarația să eșueze deoarece Col1
din tabelul sursă este inaccesibil.
ȘI < clause_search_condition >
Specifică orice condiție validă de căutare. Pentru mai multe informații, consultați Condiția de căutare (Transact-SQL).
< table_hint_limited >
Specifică unul sau mai multe indicii de tabel de aplicat pe tabelul țintă pentru fiecare dintre Introduceți, actualizați sau ștergeți acțiunile efectuate de instrucțiunea MERGE. Cuvântul cheie WITH și parantezele sunt necesare.
NOLOCK și READUNCOMMITTED nu sunt permise. Pentru mai multe informații despre indicii de tabel, consultați Sugestii de tabel (Transact-SQL).
Specificarea indiciului TABLOCK pe un tabel care „este ținta unei instrucțiuni INSERT are același efect ca și specificarea indiciului TABLOCKX. O blocare exclusivă este luată pe masă. Când este specificat FORCESEEK, acesta se aplică pentru instanța implicită a tabelului țintă alăturată tabelului sursă.
Atenție
Specificarea READPAST cu WHEN NOT MATCHED THEN INSERT poate duce la operații INSERT care încalcă constrângerile UNICE. / p>
INDEX (index_val)
Specifică numele sau ID-ul unuia sau mai multor indici de pe tabela țintă pentru realizarea unei îmbinări implicite cu tabelul sursă. Pentru mai multe informații, consultați Sfaturi pentru tabel (Tranzacționare -SQL).
< output_clause >
Returnează un rând pentru fiecare rând din target_table care „s actualizate, inserate sau șterse, în nici o ordine specială. Acțiunea $ poate fi specificată în clauza de ieșire. $ action este o coloană de tip nvarchar (10) care returnează una din cele trei valori pentru fiecare rând: „INSERT”, „UPDATE” sau „DELETE”, în funcție de acțiunea efectuată pe acel rând. Pentru mai multe informații despre argumentele și comportamentul acestei clauze, consultați Clauza OUTPUT (Transact-SQL).
< merge_matched >
Specifică acțiunea de actualizare sau ștergere care se aplică tuturor rândurilor de target_table care nu se potrivesc cu rândurile returnate de < table_source > ON < merge_search_condition > și care îndeplinesc orice condiție de căutare suplimentară.
UPDATE SET < set_clause >
Specifică lista numelor de coloane sau variabile de actualizat în tabelul țintă și valorile cu care să le actualizați.
Pentru mai multe informații despre argumentele acestei clauze, consultați UPDATE (Transact-SQL). Setarea unei variabile la aceeași valoare ca o coloană nu este acceptată.
ȘTERGERE
Specifică faptul că rândurile care corespund rândurilor din target_table sunt șterse.
< merge_not_matched >
Specifică valorile de inserat în tabelul țintă.
(column_list)
O listă de una sau mai multe coloane din tabelul țintă în care să inserați date. Coloanele trebuie să fie specificate ca un nume dintr-o singură parte sau altfel instrucțiunea MERGE va eșua. lista_coloană trebuie să fie închisă între paranteze și delimitată prin virgule.
VALUES ( values_list)
O listă separată prin virgule de constante, variabile sau expresii care returnează valori pentru a fi inserate în tabelul țintă. Expresiile nu pot conține o instrucțiune EXECUTE.
VALORI DEFAULT
Forțează rând inserat pentru a conține valorile implicite definite pentru fiecare coloană.
Pentru mai multe informații despre această clauză, consultați INSERT (Transact-SQL).
< search_condition >
Speci corespunde condițiilor de căutare pentru a specifica < merge_search_condition > sau < clause_search_condition >. Pentru mai multe informații despre argumentele pentru această clauză, consultați Condiția de căutare (Transact-SQL).
< model de căutare a graficului >
Specifică modelul de potrivire a graficului. Pentru mai multe informații despre argumentele pentru această clauză, consultați MATCH (Transact-SQL)
Observații
Notă
În Azure Synapse Analytics, MERGE comanda (previzualizare) are următoarele diferențe în comparație cu serverul SQL și baza de date SQL Azure.
- O actualizare MERGE este implementată ca o pereche de ștergere și inserare. Numărul de rânduri afectat pentru o actualizare MERGE include rândurile șterse și inserate.
- În timpul previzualizării, tabelele cu coloana de identitate nu sunt acceptate de comanda Synapse SQL MERGE.
- Suportul pentru tabelele cu diferite tipuri de distribuție sunt descrise în acest tabel:
CLAUZĂ DE ÎMBINARE în Azure Synapse Analytics Tabel de distribuție TARGE acceptat Tabel de distribuție SOURCE acceptat Comentariu CÂND S-A COMPARTIT Toate tipurile de distribuție Toate tipurile de distribuție NECONFORMATĂ ÎN TINĂ HASH Toate tipurile de distribuție Utilizați ACTUALIZARE / ȘTERGERE DIN … ÎNSCRIEȚI-vă pentru a sincroniza două tabele. NECORDAT DE SURSE Toate tipurile de distribuție Toate tipurile de distribuție
Trebuie specificată cel puțin una dintre cele trei clauze MATCHED, dar pot fi specificate în orice ordine. O variabilă nu poate fi actualizată de mai multe ori în aceeași clauză MATCHED.
Orice acțiune de inserare, actualizare sau ștergere specificată pe tabela țintă de instrucțiunea MERGE este limitată de orice constrângeri definite pe aceasta, inclusiv orice constrângeri de integritate referențială în cascadă. Dacă IGNORE_DUP_KEY este ACTIVAT pentru orice index unic pe tabela țintă, MERGE ignoră această setare.
Instrucțiunea MERGE necesită un punct și virgulă (;) ca terminator al instrucțiunilor. Eroarea 10713 este ridicată atunci când se execută o instrucțiune MERGE fără terminator.
Când este utilizată după MERGE, @@ ROWCOUNT (Transact-SQL) returnează clientului numărul total de rânduri inserate, actualizate și șterse.
MERGE este un cuvânt cheie complet rezervat atunci când nivelul de compatibilitate a bazei de date este setat la 100 sau mai mare. Declarația MERGE este disponibilă atât la nivelurile de compatibilitate a bazelor de date, cât și la 90 și 100; cu toate acestea, cuvântul cheie nu este „complet rezervat atunci când nivelul de compatibilitate a bazei de date este setat la 90.
Nu utilizați instrucțiunea MERGE atunci când utilizați replicarea de actualizare în coadă. Declanșatorul MERGE și actualizarea în coadă nu sunt compatibile. Înlocuiți instrucțiunea MERGE cu o instrucțiune insert sau de actualizare.
Implementarea declanșatorului
Pentru fiecare acțiune de inserare, actualizare sau ștergere specificată în instrucțiunea MERGE, SQL Server declanșează orice declanșator AFTER corespunzător definit pe tabela țintă, dar nu garantează acțiunea de declanșare care declanșează primul sau ultimul. Declanșatoarele definite pentru aceeași acțiune respectă ordinea specificată de dvs. Pentru mai multe informații despre setarea ordinii de declanșare a declanșatorului, consultați Specificați primul și ultimul declanșator.
Dacă tabelul țintă are un declanșator INSTEAD OF activat definit pe el pentru o acțiune de inserare, actualizare sau ștergere efectuată de o instrucțiune MERGE , trebuie să aibă un declanșator INSTEAD OF activat pentru toate acțiunile specificate în instrucțiunea MERGE.
Dacă orice declanșatoare INSTEAD OF UPDATE sau INSTEAD OF DELETE sunt definite în target_table, operațiunile de actualizare sau ștergere nu sunt „t rulați. În schimb, declanșatoarele se declanșează, iar tabelele inserate și șterse se completează în consecință.
Dacă orice declanșatoare INSTEAD OF INSERT sunt definite pe target_table, operația de inserare nu este efectuată. În schimb, tabelul se completează corespunzător.
Permisiuni
Necesită permisiuni SELECT pe tabela sursă și permisiuni INSERT, UPDATE sau DELETE pe tabela țintă. Pentru mai multe informații, consultați secțiunea Permisiuni din articolele SELECT, INSERT, UPDATE și DELETE.
Optimizarea performanței declarației MERGE
Prin utilizarea instrucțiunii MERGE, puteți înlocui DML individual. declarații cu o singură declarație. Acest lucru poate îmbunătăți performanța interogării, deoarece operațiunile sunt efectuate într-o singură declarație, prin urmare, minimizând de câte ori sunt procesate datele din tabelele sursă și țintă. Cu toate acestea, câștigurile de performanță depind de existența unor indici, îmbinări și alte considerații corecte.
Cele mai bune practici în materie de index
Pentru a îmbunătăți performanța declarației MERGE, vă recomandăm următoarele linii directoare despre index. :
- Creați un index pe coloanele de asociere din tabelul sursă care să fie unic și care să acopere.
- Creați un index unic grupat pe coloanele de asociere din tabelul țintă.
Acești indici asigură faptul că cheile de asociere sunt unice și că datele din tabele sunt sortate. Performanța interogării este îmbunătățită deoarece optimizatorul de interogare nu trebuie să efectueze o procesare suplimentară de validare pentru a localiza și actualiza rândurile duplicate și nu sunt necesare operații de sortare suplimentare.
ÎNSCRIEȚI-VĂ la cele mai bune practici
Pentru a îmbunătăți performanța declarației MERGE și asigurarea obținerii rezultatelor corecte, vă recomandăm următoarele instrucțiuni de înscriere:
- Specificați numai condițiile de căutare în ON < merge_search_condition > clauză care determină criteriile pentru potrivirea datelor în tabelele sursă și țintă. Adică, specificați numai coloanele din tabelul țintă care sunt comparate cu coloanele corespunzătoare din tabelul sursă.
- Nu includeți comparații cu alte valori, cum ar fi o constantă.
Pentru a filtra rândurile din tabelele sursă sau țintă, utilizați una dintre următoarele metode.
- Specificați condiția de căutare pentru filtrarea rândurilor în clauza WHEN corespunzătoare. De exemplu, WHEN NOT MATCHED AND S.EmployeeName LIKE „S%” THEN INSERT ….
- Definiți o vizualizare pe sursă sau țintă care returnează rândurile filtrate și faceți referire la vizualizare ca sursă sau țintă masa. Dacă vizualizarea este definită pe tabela țintă, orice acțiune împotriva acesteia trebuie să îndeplinească condițiile pentru actualizarea vizualizărilor. Pentru mai multe informații despre actualizarea datelor utilizând o vizualizare, consultați Modificarea datelor printr-o vizualizare.
- Utilizați clauza
WITH <common table expression>
pentru a filtra rândurile din tabelele sursă sau țintă . Această metodă este similară cu specificarea unor criterii de căutare suplimentare în clauza ON și poate produce rezultate incorecte. Vă recomandăm să evitați utilizarea acestei metode sau să testați temeinic înainte de a o implementa.
Operațiunea de asociere din instrucțiunea MERGE este optimizată în același mod ca o asociere într-o instrucțiune SELECT. Adică, atunci când procesele SQL Server îmbină, optimizatorul de interogare alege cea mai eficientă metodă (din mai multe posibilități) de procesare a îmbinării. Atunci când sursa și ținta sunt de dimensiuni similare și ghidurile de index descrise anterior sunt aplicate tabelelor sursă și țintă, un operator de îmbinare combinată este cel mai eficient plan de interogare. Acest lucru se datorează faptului că ambele tabele sunt scanate o singură dată și nu este nevoie să sortați datele. Când sursa este mai mică decât tabelul țintă, este preferabil un operator de bucle imbricate.
Puteți forța utilizarea unei anumite asocieri specificând clauza OPTION (<query_hint>)
în declarația MERGE. Vă recomandăm să nu utilizați hash join ca un indiciu de interogare pentru instrucțiunile MERGE deoarece acest tip de join nu folosește indici.
Cele mai bune practici de parametrizare
Dacă un SELECT, INSERT, UPDATE , sau instrucțiunea DELETE este executată fără parametri, optimizatorul de interogare SQL Server poate alege să parametrizeze instrucțiunea intern. Aceasta înseamnă că orice valoare literală conținută în interogare este înlocuită cu parametri. De exemplu, declarația INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), poate fi implementată intern ca INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Acest proces, numit parametrizare simplă, mărește capacitatea motorului relațional de a potrivi noile instrucțiuni SQL cu planurile de execuție existente, compilate anterior. Performanța interogării poate fi îmbunătățită, deoarece frecvența compilărilor și recompilărilor de interogări este redusă. Optimizatorul de interogare nu aplică procesul de parametrizare simplu instrucțiunilor MERGE. Prin urmare, instrucțiunile MERGE care conțin valori literale pot să nu funcționeze la fel de bine ca instrucțiunile INSERT, UPDATE sau DELETE individuale deoarece un nou plan este compilat de fiecare dată când se execută instrucțiunea MERGE.
Pentru a îmbunătăți performanța interogării, vă recomandăm următoarele linii directoare de parametrizare:
- Parametrează toate valorile literale din clauza
ON <merge_search_condition>
și dinWHEN
clauzele declarației MERGE. De exemplu, puteți încorpora instrucțiunea MERGE într-o procedură stocată înlocuind valorile literale cu parametrii de intrare corespunzători. - Dacă nu puteți parametra declarația, creați un ghid de plan de tip
TEMPLATE
și specificațiPARAMETERIZATION FORCED
indiciu de interogare în ghidul planului. - Dacă instrucțiunile MERGE sunt executate frecvent în baza de date, luați în considerare setarea opțiunii PARAMETERIZARE pe baza de date la FORȚAT. Aveți grijă când setați această opțiune. Opțiunea
PARAMETERIZATION
este o setare la nivel de bază de date și afectează modul în care sunt procesate toate interogările din baza de date.
Cele mai bune practici ale clauzei TOP
În instrucțiunea MERGE, clauza TOP specifică numărul sau procentul de rânduri care sunt afectate după ce tabela sursă și tabela țintă sunt unite și după eliminarea rândurilor care nu se califică pentru o acțiune de inserare, actualizare sau ștergere . Clauza TOP reduce și mai mult numărul de rânduri îmbinate la valoarea specificată, iar acțiunile de inserare, actualizare sau ștergere sunt aplicate rândurilor rămase unite într-un mod neordonat. Adică, nu există nicio ordine în care rândurile să fie distribuite între acțiunile definite în clauzele WHEN. De exemplu, specificarea TOP (10) afectează 10 rânduri; din aceste rânduri, 7 pot fi actualizate și 3 inserate, sau 1 pot fi șterse, 5 actualizate și 4 inserate și așa mai departe.
Este obișnuit să folosiți clauza TOP pentru a efectua limbajul de manipulare a datelor (DML) ) operații pe o masă mare în loturi. Când utilizați clauza TOP din declarația MERGE în acest scop, este important să înțelegeți următoarele implicații.
-
Performanța I / O poate fi afectată.
Instrucțiunea MERGE efectuează o scanare completă a tabelelor atât a tabelelor sursă, cât și a tabelelor țintă. Împărțirea operației în loturi reduce numărul de operații de scriere efectuate pe lot; cu toate acestea, fiecare lot va efectua o scanare completă a tabelelor a surselor și a tabelelor țintă. Activitatea de citire rezultată poate afecta performanța interogării.
-
Pot apărea rezultate incorecte.
Este important să vă asigurați că toate loturile succesive vizează rânduri noi. sau poate apărea un comportament nedorit, cum ar fi inserarea incorectă a rândurilor duplicate în tabelul țintă. Acest lucru se poate întâmpla atunci când tabelul sursă include un rând care nu se afla într-un lot țintă, dar se afla în tabelul țintă general.
-
Pentru a asigura rezultate corecte:
- Utilizați clauza ON pentru a determina care rânduri sursă afectează rândurile țintă existente și care sunt cu adevărat noi.
- Utilizați o condiție suplimentară în clauza WHEN MATCHED pentru a determina dacă rândul țintă a fost deja actualizat de un lot anterior.
Deoarece clauza TOP se aplică numai după aplicarea acestor clauze, fiecare execuție fie introduce un rând cu adevărat de neegalat, fie actualizează un rând existent.
Cele mai bune practici de încărcare în bloc
Instrucțiunea MERGE poate fi utilizată pentru a încărca în mod eficient datele dintr-un fișier de date sursă într-un tabel țintă prin specificarea clauzei OPENROWSET(BULK…)
ca sursă de masă. Procedând astfel, întregul fișier este procesat într-un singur lot.
Pentru a îmbunătăți performanța procesului de îmbinare în bloc, vă recomandăm următoarele instrucțiuni:
-
Creați un index grupat pe coloanele de asociere din tabelul țintă.
-
Utilizați sugestiile ORDER și UNIQUE din clauza
OPENROWSET(BULK…)
pentru a specifica modul în care este sortat fișierul de date sursă.În mod implicit, operația în bloc presupune că fișierul de date este neordonat. Prin urmare, este important ca datele sursă să fie sortate în funcție de indexul grupat de pe tabela țintă și să se utilizeze sugestia ORDER pentru a indica ordinea, astfel încât optimizatorul de interogare să poată genera un plan de interogare mai eficient. Sugestiile sunt validate în timpul rulării; dacă fluxul de date nu este conform cu sugestiile specificate, apare o eroare.
Aceste linii directoare asigură faptul că cheile de asociere sunt unice și ordinea de sortare a datelor în fișierul sursă se potrivește cu tabelul țintă. Performanța interogării este îmbunătățită, deoarece nu sunt necesare operații de sortare suplimentare și nu sunt necesare copii de date inutile.
Măsurarea și diagnosticarea performanței MERGE
Următoarele caracteristici sunt disponibile pentru a vă ajuta în măsurarea și diagnosticarea performanța declarațiilor MERGE.
- Utilizați contorul merge stmt în vizualizarea de gestionare dinamică sys.dm_exec_query_optimizer_info pentru a returna numărul de optimizări de interogare care sunt pentru instrucțiunile MERGE.
- Utilizați atributul merge_action_type din viziunea de management dinamic sys.dm_exec_plan_attributes pentru a returna tipul planului de execuție a declanșatorului utilizat ca rezultat al unei instrucțiuni MERGE.
- Utilizați SQL Trace pentru a colecta date de depanare pentru instrucțiunea MERGE în același mod pentru alte instrucțiuni de limbaj de manipulare a datelor (DML). Pentru mai multe informații, consultați SQL Trace.
Exemple
A. Utilizarea MERGE pentru a efectua operații INSERT și UPDATE pe un tabel într-o singură instrucțiune
Un scenariu comun este actualizarea uneia sau mai multor coloane dintr-un tabel dacă există un rând de potrivire. Sau, inserarea datelor ca un rând nou dacă nu există un rând de potrivire. De obicei, faceți oricare dintre scenarii trecând parametrii la o procedură stocată care conține instrucțiunile UPDATE și INSERT corespunzătoare. Cu instrucțiunea MERGE, puteți efectua ambele sarcini în o singură instrucțiune. Următorul exemplu prezintă o procedură stocată în baza de date AdventureWorks2012 care conține atât o instrucțiune INSERT cât și o instrucțiune UPDATE. Procedura este apoi modificată pentru a rula operațiunile echivalente utilizând o singură instrucțiune MERGE.
B . Folosind MERGE pentru a efectua operațiuni UPDATE și DELETE pe un tabel într-o singură declarație
Următorul exemplu folosește MERGE pentru a actualiza tabelul ProductInventory
din baza de date mostră AdventureWorks2012, zilnic, pe baza comenzilor care sunt procesate în tabelul SalesOrderDetail
. Coloana Quantity
din ProductInventory
este actualizat prin scăderea numărului de comenzi plasate în fiecare zi pentru fiecare produs din SalesOrderDetail
tabel. Dacă numărul de comenzi pentru un produs scade nivelul de inventar al unui produs la 0 sau mai puțin, rândul pentru produsul respectiv este șters din tabelul ProductInventory
.
C. Folosirea MERGE pentru a efectua operațiuni UPDATE și INSERT pe o tabelă țintă utilizând o tabelă sursă derivată
Următorul exemplu folosește MERGE pentru a modifica tabelul SalesReason
din baza de date AdventureWorks2012 fie actualizând, fie inserând rânduri. Când valoarea NewName
din tabelul sursă se potrivește cu o valoare din coloana Name
a tabelului țintă, (SalesReason
), coloana ReasonType
este actualizată în tabelul țintă. Când valoarea NewName
nu se potrivește, rândul sursă este inserat în tabelul țintă. Tabelul sursă este un tabel derivat care utilizează constructorul valorii tabelului Transact-SQL pentru a specifica mai multe rânduri pentru tabelul sursă. Pentru mai multe informații despre utilizarea constructorului valorii tabelului într-un tabel derivat, consultați Constructorul valorii tabelului (Transact-SQL). Exemplul arată, de asemenea, cum să stocați rezultatele clauzei OUTPUT într-o variabilă de tabel. Și, apoi rezumați rezultatele instrucțiunii MERGE executând o operație de selectare simplă care returnează numărul de rânduri inserate și actualizate.
D.Inserarea rezultatelor instrucțiunii MERGE într-un alt tabel
Următorul exemplu captează datele returnate din clauza OUTPUT a unei instrucțiuni MERGE și introduce aceste date într-un alt tabel. Instrucțiunea MERGE actualizează coloana Quantity
a tabelei ProductInventory
din baza de date AdventureWorks2012, pe baza comenzilor procesate în SalesOrderDetail
tabel. Exemplul captează rândurile actualizate și le inserează într-un alt tabel care este folosit pentru a urmări modificările inventarului.
E. Folosind MERGE pentru a face INSERT sau UPDATE pe un tabel de margine țintă într-o bază de date cu grafice
În acest exemplu, creați tabele de noduri Person
și City
și un tabel de margine livesIn
. Utilizați instrucțiunea MERGE pe marginea livesIn
și introduceți un rând nou dacă marginea nu există deja între o Person
și City
. Dacă marginea există deja, trebuie doar să actualizați atributul StreetAddress pe marginea livesIn
.