MERGE (Transact-SQL) (Magyar)

  • 2019.08.20.
  • 25 perc olvasási idő
    • X
    • c
    • j
    • r
    • a
    • +18

A következőre vonatkozik: SQL Server (az összes támogatott verzió) Azure SQL Database Azure Synapse Analytics

Egy céltábla műveleteit futtatja, frissíti vagy törli a forrás táblával való összekapcsolás eredményei. Például szinkronizáljon két táblázatot sorok beszúrásával, frissítésével vagy törlésével az egyik táblába a másik táblázatban található különbségek alapján.

Megjegyzés

A MERGE jelenleg előnézetben van Azure Synapse Analytics.

Teljesítménytipp: A MERGE utasításhoz leírt feltételes viselkedés akkor működik a legjobban, ha a két tábla az egyező jellemzők összetett keverékével rendelkezik. Például egy sor beszúrása, ha nem létezik, vagy egy sor frissítése, ha egyezik. Ha egyszerűen egy táblázatot frissít egy másik táblázat sorai alapján, javítsa a teljesítményt és a méretezhetőséget az alapvető INSERT, UPDATE és DELETE utasításokkal. példa:

Transact-SQL szintaxis konvenciók

Szintaxis

Megjegyzés

Az SQL Server 2014 és korábbi verzióinak Transact-SQL szintaxisának megtekintéséhez lásd a Korábbi verziók dokumentációját.

Argumentumok

WITH < common_table_expression >
Megadja az ideiglenesen elnevezett eredménykészletet vagy nézetet, más néven közös tábla kifejezést, amelyet “definiált” a MERGE nyilatkozat hatókörén belül. Az eredménykészlet egy egyszerű lekérdezésből származik, és a MERGE utasítás hivatkozik rá. További információ: WITH common_table_expression (Transact-SQL).

TOP (kifejezés)
Megadja az érintett sorok számát vagy százalékát. kifejezés lehet a sorok száma vagy százaléka. A TOP kifejezésben hivatkozott sorok nincsenek sorrendben rendezve. További információkért lásd: TOP (Transact-SQL).

A TOP záradék akkor érvényes, ha a teljes forrástábla és a teljes céltábla csatlakozik, és az összekapcsolt sorok, amelyek nem jogosultak beszúrásra, frissítésre vagy törlés művelet eltávolításra kerül. A TOP záradék tovább csökkenti az egyesített sorok számát a megadott értékre. A beillesztési, frissítési vagy törlési műveletek rendezetlenül vonatkoznak a többi összekapcsolt sorra. Vagyis nincs sorrend, amelyben a sorok oszlanak meg a WHEN záradékokban meghatározott műveletek között. Például a TOP (10) megadása 10 sort érint. Ezen sorok közül 7 frissíthető és 3 beszúrható, vagy 1 törölhető, 5 frissíthető és 4 beszúrható stb.

Mivel a MERGE utasítás teljes táblázatot keres mind a forrás, mind a céltáblák, az I / O teljesítmény néha befolyásolja, amikor a TOP záradékot használjuk egy nagy tábla módosításához több köteg létrehozásával. Ebben a forgatókönyvben fontos annak biztosítása, hogy az összes egymást követő köteg új sorokat célozzon meg.

database_name
Az adatbázis neve, amelyben a target_table található.

schema_name
Annak a sémának a neve, amelyhez a target_table tartozik.

target_table
Az a táblázat vagy nézet, amelyhez az adatok a < table_source párosítás a < clause_search_condition > alapján történik. A target_table minden beillesztési, frissítési vagy törlési művelet célja A MERGE utasítás WHEN záradékai határozzák meg.

Ha a target_table nézet, akkor az ellene irányuló minden tevékenységnek meg kell felelnie a nézetek frissítésének feltételeinek. További információ: Adatok módosítása nézeten keresztül.

A target_table nem lehet távoli tábla. A target_table nem adhat meg semmilyen szabályt.

table_alias
Alternatív név, amely a target_table táblára hivatkozik.

< table_source >
Megadja azt az adatforrást, amely megfelelt a cél_tábla adatsorainak a < merge_search feltétel >. Ennek a meccsnek az eredménye diktálja a MERGE nyilatkozat WHEN záradékai által végrehajtandó intézkedéseket. A < table_source > lehet távoli tábla vagy származtatott tábla, amely hozzáfér a távoli táblákhoz.

< table_source > lehet egy származtatott tábla, amely a Transact-SQL táblaérték-konstruktort használja egy tábla létrehozásához több sor megadásával. > table_alias
Alternatív név, amely hivatkozik a table_source táblára.

A záradék szintaxisával és argumentumaival kapcsolatos további információkért lásd: FROM (Transact-SQL).

BE < merge_search_condition >
Megadja azokat a feltételeket, amelyek mellett < table_source > csatlakozik a target_table-hez, hogy meghatározza, hol egyeznek.

Vigyázat

Fontos csak megadni a céltábla oszlopai, amelyeket egyeztetési célokra használhat. Vagyis adja meg a céltábla oszlopait, amelyeket összehasonlítanak a forrás táblázat megfelelő oszlopával. Ne próbálja meg javítani a lekérdezés teljesítményét a céltábla sorainak kiszűrésével a az ON záradék; például a AND NOT target_table.column_x = value megadását. Ez váratlan és helytelen eredményeket hozhat.

AMIKOR MEGFELELŐDIK < merge_matched >
Megadja, hogy a * target_table összes sora, amely megfelel a < table_source > ON < merge_search_condition > és megfelelnek minden további keresési feltételnek, vagy frissülnek, vagy törlésre kerülnek a < merge_matched > záradék.

A MERGE utasítás legfeljebb két WHERE MATCH záradékot tartalmazhat. Ha két tagmondat van megadva, az első tagmondathoz mellékelni kell egy AND < keresési feltétel > záradékot. Bármelyik sorhoz a második MIKOR MEGFELELŐ záradék csak akkor alkalmazandó, ha az első nem “t”. Ha két MIK MEG KÖZÖTT záradék van, akkor meg kell adnia egy UPDATE és egy DELETE műveletet. Ha az UPDATE meg van adva a < merge_matched > záradék, és egynél több sor < table_source > egyezik a target_table egy sorával a < merge_search_condition > alapján, az SQL Server hibát ad vissza. Az MERGE utasítás” t ne frissítse ugyanazt a sort többször, vagy frissítse és törölje ugyanazt a sort.

AMIKOR NEM MEGFELELT < merge_not_matched >
Megadja, hogy minden sor beillesztésre kerül a target_table-be, amelyet < table_source > BE merge_search_condition > amely nem felel meg a Targ sorainak et_table, de megfelel egy további keresési feltételnek, ha van. A beillesztendő értékeket a < merge_not_matched > záradék határozza meg. A MERGE utasításnak csak egy lehet MIKOR NEM MEGFELELŐ záradék.

AMIKOR NEM FELELŐDIK A FORRÁSBAN, akkor < merge_matched >
Megadja, hogy a * target_table összes sora, amely nem felel meg a < table_source > ON < merge_search_condition > és minden további keresési feltételt kielégít, az < merge_matched > záradék.

A MERGE utasítás legfeljebb kettő lehet, AMIKOR NEM EGYÜT A FORRÁS záradék. Ha két záradék van megadva, akkor az első tagmondathoz mellékelni kell egy AND < clause_search_condition > záradék. Bármely adott sorra a második, AMIKOR NEM MEGFELEL A FORRÁS, záradék csak akkor alkalmazandó, ha az első nincs ” t. Ha kettő van, AMIKOR NEM TETT A FORRÁS záradék, akkor meg kell adni egy UPDATE és egy DELETE műveletet. Csak a céltábla oszlopaira lehet hivatkozni a < clause_search_condition > mezőben.

Ha egyetlen sor sem jelenik meg a < table_source >, a forrás táblázat oszlopai nem érhetők el. Ha a merge_matched > záradék hivatkozási oszlopokra hivatkozik a forrás táblában, a 207 (érvénytelen oszlopnév) hiba jelenik meg. Például a okozhatja az utasítás meghiúsulását, mert a forrás táblában található Col1 nem érhető el.

ÉS < clause_search_condition >
Meghatározza az érvényes keresési feltételeket. További információ: Keresési feltétel (Transact-SQL).

< table_hint_limited >
Meghatároz egy vagy több táblázati tippet, amelyeket alkalmazni kell a céltáblán mindegyikhez e illessze be, frissítse vagy törölje a MERGE utasítás műveleteit. A WITH kulcsszó és a zárójel kötelező.

A NOLOCK és a READUNCOMMITTED nem engedélyezett. A táblázati tippekkel kapcsolatos további információkért lásd: Táblázati tippek (Transact-SQL).

A TABLOCK utalás megadása egy olyan táblán, amely egy INSERT utasítás célpontja, ugyanolyan hatású, mint a TABLOCKX tipp megadása. Egy exkluzív zár kerül az asztalra. A FORCESEEK megadásakor ez a a céltábla implicit példánya csatlakozik a forrás táblához.

Vigyázat

A READPAST megadása azzal, hogy MIKOR NEM MEGFELELŐDIK AZ INSERT, INSERT műveleteket eredményezhet, amelyek megsértik az UNIQUE korlátozásokat.

INDEX (index_val)
Megadja a céltáblán található egy vagy több index nevét vagy azonosítóját, hogy implicit módon csatlakozzon a forrás táblához. További információ: Táblázati tippek (Tranzakció) -SQL).

< output_clause >
Sorot ad vissza a target_table minden sorához, amely “s frissíteni, beilleszteni vagy törölni, külön sorrendben. A $ művelet megadható a kimeneti záradékban. A $ action egy nvarchar (10) típusú oszlop, amely minden sor három értékének egyikét adja vissza: “INSERT”, “UPDATE” vagy “DELETE”, az adott soron végzett műveletnek megfelelően. A záradék argumentumaival és viselkedésével kapcsolatos további információkért lásd: OUTPUT klauzula (Transact-SQL).

< merge_matched >
Megadja azt a frissítési vagy törlési műveletet, amelyet a target_table minden olyan sorára alkalmaznak, amelyek nem egyeznek a < table_source BE < merge_search_condition >, és amelyek megfelelnek minden további keresési feltételnek.

UPDATE SET < set_clause >
Megadja a céltáblában frissítendő oszlop- vagy változónevek listáját, valamint azokat az értékeket, amelyekkel frissíteni kell őket.

A záradék argumentumaival kapcsolatos további információk: UPDATE (Transact-SQL). A változó oszlopra azonos értékre állítása nem támogatott.

DELETE
Megadja, hogy a target_table sorainak megfelelő sorok törlődjenek.

< merge_not_matched >
Megadja a céltáblába beillesztendő értékeket.

(column_list)
Egy vagy további oszlopok a céltáblából, ahová adatokat kell beszúrni. Az oszlopokat egyrészes névként kell megadni, különben a MERGE utasítás meghiúsul. Az oszlop_listát zárójelbe kell foglalni, és vesszővel kell elválasztani.

VALUES ( érték_lista)
vesszővel elválasztott konstansok, változók vagy kifejezések listája, amelyek értékeket adnak vissza a céltáblába. A kifejezések nem tartalmazhatnak EXECUTE utasítást.

ALAPÉRTÉKEK
Kényszeríti a beszúrt sor az egyes oszlopokhoz definiált alapértelmezett értékeket tartalmazza.

A záradékkal kapcsolatos további információkért lásd: INSERT (Transact-SQL).

< search_condition >
Specifikációk a keresési feltételeket meghatározza a < merge_search_condition > vagy < clause_search_condition . A záradék argumentumaival kapcsolatos további információkért lásd: Keresési feltétel (Transact-SQL).

< grafikon keresési minta >
Megadja a grafikon egyezési mintázatát. A záradék argumentumaival kapcsolatos további információkért lásd: MATCH (Transact-SQL)

Megjegyzések

Megjegyzés

Az Azure Synapse Analytics alkalmazásban A parancs (előnézet) a következő különbségekkel rendelkezik az SQL szerverhez és az Azure SQL adatbázishoz képest.

  • A MERGE frissítést törlés és beszúrás párként valósítják meg. A MERGE frissítés érintett sorainak száma a törölt és a beillesztett sorokat tartalmazza.
  • Az előnézet során az identitás oszlopú táblákat nem támogatja a Synapse SQL MERGE parancs.
  • A A különböző terjesztéstípusokkal rendelkező táblákat ez a táblázat ismerteti:

EGYESÍTÉSI KOCKÁZAT az Azure Synapse Analyticsben Támogatott TARGE terjesztési táblázat Támogatott SOURCE terjesztési táblázat Megjegyzés
MIKOR MEGFELELIK Minden terjesztéstípus Minden terjesztéstípus
NEM VONATKOZIK A CÉL HASH Minden terjesztéstípus Két táblázat szinkronizálásához használja az UPDATE / DELETE FROM… JOIN parancsot.
NEM TETT A FORRÁSBAN Minden terjesztéstípus Minden terjesztéstípus

A három MATCHED záradék közül legalább egyet meg kell adni, de tetszőleges sorrendben megadhatók. Egy változó nem frissíthető többször ugyanabban a MATCHED záradékban.

A MERGE utasítás által a céltáblán megadott bármely beillesztési, frissítési vagy törlési műveletet korlátozzák a rajta meghatározott korlátozások, beleértve a lépcsőzetes hivatkozási integritás korlátozásait is. Ha az IGNORE_DUP_KEY BE van kapcsolva a céltábla bármely egyedi indexéhez, akkor a MERGE figyelmen kívül hagyja ezt a beállítást.

A MERGE utasításhoz pontosvesszőt (;) kell használni, mint utasítás terminátort. A 10713 hiba akkor merül fel, amikor a MERGE utasítás fut le a terminátor nélkül.

A MERGE után történő használat esetén a @@ ROWCOUNT (Transact-SQL) a beszúrott, frissített és törölt sorok teljes számát adja vissza az ügyfélnek.

A MERGE egy teljesen fenntartott kulcsszó, ha az adatbázis-kompatibilitási szintet 100-ra vagy magasabbra állítják. A MERGE utasítás 90 és 100 adatbázis-kompatibilitási szint alatt is elérhető; azonban a kulcsszó nincs teljesen lefoglalva, ha az adatbázis-kompatibilitási szint 90-re van állítva.

Ne használja a MERGE utasítást a várakozási sorban lévő frissítő replikáció használatakor. A MERGE és a várakozási sorban lévő frissítési eseményindító nem kompatibilis. Cserélje ki a MERGE utasítást beszúrással vagy frissítési utasítással.

Trigger implementáció

A (z) a MERGE utasítással az SQL Server indítja a céltáblázatban definiált megfelelő AFTER indítókat, de nem garantálja, hogy melyik aktiválandó művelet indul el először vagy utoljára. Az ugyanazon művelethez definiált triggerek tiszteletben tartják a megadott sorrendet. Az aktiválási indítási sorrend beállításáról további információt az Első és az utolsó triggerek megadása című témakörben talál.

Ha a céltáblában engedélyezett INSTEAD OF trigger van definiálva egy MERGE utasítással végrehajtott beszúrási, frissítési vagy törlési művelethez. , engedélyezettnek kell lennie az INSTEAD OF triggerrel a MERGE utasításban megadott összes művelethez.

Ha az INSTEAD OF UPDATE vagy INSTEAD OF DELETE eseményindítók meg vannak határozva a target_table-n, a frissítési vagy törlési műveletek Ehelyett az indítók elindulnak, a beillesztett és törölt táblák pedig ennek megfelelően feltöltődnek.

Ha a INSERT INSERT eseményindítók meg vannak határozva a target_table-n, akkor a beszúrási művelet nem lesz végrehajtva. Ehelyett a táblázat ennek megfelelően tölti be.

Engedélyek

Szükség van a SELECT engedélyre a forrás táblában, és INSERT, UPDATE vagy DELETE engedélyekre a céltáblán. További információkért olvassa el a SELECT, INSERT, UPDATE és DELETE cikkek Engedélyek szakaszát.

A MERGE utasítás teljesítményének optimalizálása

A MERGE utasítás használatával lecserélheti az egyes DML-eket. állítások egyetlen állítással. Ez javíthatja a lekérdezés teljesítményét, mivel a műveleteket egyetlen utasításban hajtják végre, ezért minimalizálva a forrás- és céltáblák adatainak feldolgozását. A teljesítménynövekedés azonban attól függ, hogy megfelelő indexek, összekapcsolások és egyéb szempontok vannak-e érvényben.

Az index bevált módszerei

A MERGE utasítás teljesítményének javítása érdekében a következő index-irányelveket javasoljuk. :

  • Hozzon létre egy egyedi és lefedő indexet a forrástábla egyesítési oszlopain.
  • Hozzon létre egy egyedi fürtözött indexet a céltábla egyesítési oszlopain.

Ezek az indexek biztosítják, hogy a csatlakozási kulcsok egyediek legyenek, és a táblák adatai rendezve legyenek. A lekérdezés teljesítménye azért javult, mert a lekérdezés-optimalizálónak nem kell külön ellenőrzési folyamatot végrehajtania az ismétlődő sorok felkutatásához és frissítéséhez, és további rendezési műveletekre nincs szükség.

CSATLAKOZZA A bevált módszerekkel

A MERGE utasítás teljesítményének biztosítása és a megfelelő eredmények elérése érdekében javasoljuk a következő csatlakozási irányelveket:

  • Csak az ON < merge_search_condition > záradék, amelyek meghatározzák az adatok megfeleltetésének feltételeit a forrás és a cél táblában. Ez azt jelenti, hogy a céltáblázatból csak azokat az oszlopokat adja meg, amelyeket összehasonlítanak a forrás táblázat megfelelő oszlopaival.
  • Ne adjon összehasonlítást más értékekkel, például egy konstanssal.

A források vagy a céltáblák sorainak kiszűréséhez használja a következő módszerek egyikét.

  • Adja meg a sorszűrés keresési feltételét a megfelelő WHEN záradékban. Például, AMIKOR NEM MEGFELEL, ÉS A S.EmployeeName MINT “S%”, MIKOR INSERT …
  • Definiáljon egy nézetet a forráson vagy a célon, amely visszaadja a szűrt sorokat, és hivatkozjon a nézetre forrásként vagy célként asztal. Ha a nézet meg van határozva a céltáblán, akkor az ellene irányuló bármely műveletnek meg kell felelnie a nézetek frissítésének feltételeinek. További információ az adatok nézet használatával történő frissítéséről: Az adatok módosítása nézeten keresztül.
  • Használja az WITH <common table expression> záradékot, hogy kiszűrje a sorokat a forrás- vagy céltáblákból. . Ez a módszer hasonló a további keresési feltételek megadásához az ON záradékban, és helytelen eredményeket hozhat. Javasoljuk, hogy kerülje el ezt a módszert, vagy alaposan tesztelje, mielőtt végrehajtaná.

A MERGE utasítás egyesítési művelete ugyanúgy optimalizálódik, mint a SELECT utasítás egyesítése. Vagyis amikor az SQL Server folyamatok csatlakoznak, a lekérdezés-optimalizáló a leghatékonyabb módszert választja (a több lehetőség közül) a csatlakozás feldolgozására. Ha a forrás és a cél hasonló méretű, és a korábban leírt index-irányelveket alkalmazzák a forrás- és céltáblákra, akkor az egyesítés-csatlakozás operátor a leghatékonyabb lekérdezési terv. Ez azért van, mert mindkét táblát egyszer szkennelik, és nincs szükség az adatok rendezésére. Ha a forrás kisebb, mint a céltábla, akkor előnyös a beágyazott hurkok operátora.

Kényszerítheti egy adott csatlakozás használatát a OPTION (<query_hint>) záradék megadásával. a MERGE nyilatkozatot. Javasoljuk, hogy ne használja a kivonat-csatlakozást lekérdezési tippként a MERGE utasításokhoz, mert ez a csatlakozási típus nem használ indexeket.

Paraméterezés bevált módszerei

Ha SELECT, INSERT, UPDATE , vagy a DELETE utasítás paraméterek nélkül kerül végrehajtásra, az SQL Server lekérdezés-optimalizáló dönthet úgy, hogy az utasítás belső paraméterezését végzi. Ez azt jelenti, hogy a lekérdezésben szereplő bármely szó szerinti értéket paraméterekkel helyettesítjük. Például az INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10) utasítás belső úton megvalósítható INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2) néven. Ez az egyszerű paraméterezésnek nevezett folyamat növeli a relációs motor képességét arra, hogy az új SQL utasításokat hozzáigazítsa a meglévő, korábban összeállított végrehajtási tervekhez. A lekérdezés teljesítménye javulhat, mert a lekérdezések és az újrafordítások gyakorisága csökken. A lekérdezés-optimalizáló nem alkalmazza az egyszerű paraméterezési folyamatot a MERGE utasításokra. Ezért a szó szerinti értékeket tartalmazó MERGE utasítások nem biztos, hogy olyan jól teljesítenek, mint az egyes INSERT, UPDATE vagy DELETE utasítások, mert a MERGE utasítás végrehajtásakor minden alkalommal új tervet állítanak össze.

A lekérdezés teljesítményének javításához javasoljuk a következő paraméterezési irányelvek:

  • Paraméterezze az összes szó szerinti értéket a ON <merge_search_condition> záradékban és a WHEN a MERGE nyilatkozat záradékai. Például beépítheti a MERGE utasítást egy tárolt eljárásba, helyettesítve a szó szerinti értékeket megfelelő bemeneti paraméterekkel.
  • Ha nem tudja paraméterezni az utasítást, készítsen egy TEMPLATE és adja meg a PARAMETERIZATION FORCED lekérdezési tippet a terv útmutatóban.
  • Ha a MERGE utasításokat gyakran hajtják végre az adatbázisban, fontolja meg a PARAMETERIZATION opció beállítását a adatbázis kényszeríteni. Vigyázzon az opció beállításakor. Az PARAMETERIZATION opció adatbázis-szintű beállítás, amely befolyásolja az adatbázis összes lekérdezésének feldolgozását.

Legjobb gyakorlatok

A MERGE utasításban a TOP záradék meghatározza azon sorok számát vagy százalékos arányát, amelyeket a forrástábla és a céltábla egyesítése után érintenek, és azok után a sorok eltávolítása után, amelyek nem felelnek meg beillesztési, frissítési vagy törlési műveletnek . A TOP záradék tovább csökkenti az összekapcsolt sorok számát a megadott értékre, és a beillesztési, frissítési vagy törlési műveletek rendezetlenül alkalmazzák a fennmaradó összekapcsolt sorokat. Vagyis nincs sorrend, amelyben a sorok el vannak osztva a WHEN záradékokban meghatározott műveletek között. Például a TOP (10) megadása 10 sort érint; ebből a sorból 7 frissíthető és 3 beilleszthető, vagy 1 törölhető, 5 frissíthető, 4 beilleszthető stb.

Gyakran a TOP záradékot használják az adatkezelési nyelv végrehajtására (DML ) műveletek nagy asztalon, tételenként. A MERGE utasítás TOP címkéjének ilyen célú használatakor fontos megérteni a következő következményeket.

  • Ez befolyásolhatja az I / O teljesítményt.

    A MERGE utasítás teljes táblapontot hajt végre mind a forrás-, mind a céltáblákon. A művelet kötegekre bontása csökkenti a kötegenként végrehajtott írási műveletek számát; mindazonáltal minden köteg elvégzi a forrás- és céltáblák teljes táblázatos beolvasását. A kapott olvasási tevékenység befolyásolhatja a lekérdezés teljesítményét.

  • Helytelen eredmények fordulhatnak elő.

    Fontos biztosítani, hogy minden egymást követő köteg új sorokat célozzon meg. vagy előfordulhat olyan nem kívánt viselkedés, mint a duplikált sorok helytelen beszúrása a céltáblába. Ez akkor fordulhat elő, ha a forrástábla olyan sort tartalmaz, amely nem volt megcélzott kötegben, de benne volt az általános céltáblában.

  • A helyes eredmények biztosítása:

    • Az ON záradékkal meghatározhatja, hogy mely forrássorok befolyásolják a meglévő célsorokat, és melyek valóban újak.
    • Használjon egy további feltételt a WHEN MATCHED záradékban annak megállapításához, hogy a célsort már frissítette-e a előző tétel.

Mivel a TOP záradék csak ezen záradékok alkalmazása után kerül alkalmazásra, minden végrehajtás vagy beilleszt egy valóban páratlan sort, vagy egy meglévő sort frissít.

A tömeges betöltés bevált módszerei

A MERGE utasítással hatékonyan töltheti be az adatokat egy forrás adatfájlból a céltáblába a OPENROWSET(BULK…) záradék megadásával. mint a táblázat forrása. Ezzel a teljes fájlt egyetlen kötegben dolgozza fel.

A tömeges egyesítési folyamat teljesítményének javítása érdekében a következő irányelveket javasoljuk:

  • Hozzon létre fürtözött indexet a céltábla összekapcsolási oszlopain.

  • A OPENROWSET(BULK…) záradékban szereplő ORDER és UNIQUE tippeket adhatja meg. a forrás adatfájl rendezése.

    Alapértelmezés szerint a tömeges művelet feltételezi, hogy az adatfájl rendezetlen. Ezért fontos, hogy a forrásadatokat a céltáblázat fürtözött indexe szerint rendezzük, és hogy a ORDER tippet használjuk a sorrend megjelölésére, hogy a lekérdezés-optimalizáló hatékonyabb lekérdezési tervet generálhasson. A tippeket futás közben érvényesítik; ha az adatfolyam nem felel meg a megadott tippeknek, hiba lép fel.

Ezek az irányelvek biztosítják, hogy a csatlakozási kulcsok egyediek legyenek, és az adatok rendezési sorrendje a forrásfájl megegyezik a céltáblával. A lekérdezés teljesítménye azért javult, mert nincs szükség további rendezési műveletekre, és nincs szükség felesleges adatmásolatokra.

A MERGE teljesítmény mérése és diagnosztizálása

A következő funkciók állnak rendelkezésre a méréshez és a diagnosztizáláshoz. a MERGE utasítások teljesítménye.

  • A sys.dm_exec_query_optimizer_info dinamikus kezelési nézetben használja az egyesítés stmt számlálót a MERGE utasításokhoz tartozó lekérdezés-optimalizálások számának visszaadásához.
  • Használja a sys.dm_exec_plan_attributes dinamikus kezelési nézetben található merge_action_type attribútum visszaadja a MERGE utasítás eredményeként használt kiváltó végrehajtási terv típusát.
  • Az SQL Trace használatával ugyanúgy gyűjtsön hibaelhárítási adatokat a MERGE utasításhoz. más adatkezelési nyelv (DML) utasításokhoz tennéd. További információ: SQL Trace.

Példák

A. A MERGE segítségével INSERT és UPDATE műveleteket hajthat végre egy táblában egyetlen utasításban

Gyakori forgatókönyv egy vagy több oszlop frissítése a táblázatban, ha egyező sor létezik. Vagy beillesztheti az adatokat új sorként, ha egyező sor nem létezik. Általában bármelyik forgatókönyvet úgy hajtja végre, hogy paramétereket ad át egy tárolt eljárásnak, amely tartalmazza a megfelelő UPDATE és INSERT utasításokat. A MERGE utasítással mindkét feladatot megteheti egyetlen utasítás. A következő példa egy tárolt eljárást mutat be az AdventureWorks2012database-ben, amely INSERT és UPDATE utasításokat egyaránt tartalmaz. Ezután az eljárást úgy módosítják, hogy egyetlen MERGE utasítással futtassák az egyenértékű műveleteket.

B . A MERGE segítségével UPDATE és DELETE műveleteket hajthat végre egy táblázatban egyetlen utasításban

A következő példa a MERGE segítségével frissíti az ProductInventory táblázatot az AdventureWorks2012 minta adatbázisban, naponta, a SalesOrderDetail táblában feldolgozott megrendelések alapján. A Quantity oszlop a ProductInventory táblázatot úgy frissítjük, hogy kivonjuk a SalesOrderDetail táblázat. Ha egy termék rendeléseinek száma 0-ra vagy annál kevesebbre csökkenti a termék készletszintjét, akkor az adott termék sora törlődik a ProductInventory táblázatból.

C. A MERGE segítségével UPDATE és INSERT műveleteket hajthat végre egy céltáblán egy származtatott forrástábla használatával

A következő példa a MERGE segítségével módosítja az SalesReason táblázatot az AdventureWorks2012 adatbázisban sorok frissítésével vagy beszúrásával. Amikor a forrás táblában szereplő NewName értéke megegyezik a céltábla Name oszlopának értékével, (SalesReason), a ReasonType oszlop frissül a céltáblában. Ha az NewName értéke nem egyezik, akkor a forrássor beillesztésre kerül a céltáblába. A forrástábla egy származtatott tábla, amely a Transact-SQL táblaérték-konstruktort használja többszörös megadásához. sorok a forrástáblához. A táblázatérték-szerkesztő származtatott táblázatban történő használatáról további információt a Táblázatérték-szerkesztő (Transact-SQL) című témakörben talál. A példa azt is bemutatja, hogyan tárolhatja az OUTPUT záradék eredményeit egy táblázatváltozóban. majd összefoglalja a MERGE utasítás eredményeit egy egyszerű kiválasztási művelet futtatásával, amely visszaadja a beszúrt és frissített sorok számát.

D.A MERGE utasítás eredményeinek beszúrása egy másik táblába

Az alábbi példa rögzíti a MERGE utasítás OUTPUT záradékából visszaküldött adatokat, és beszúrja ezeket az adatokat egy másik táblába. A MERGE utasítás frissíti az AdventureWorks2012 adatbázis Quantity oszlopát az ProductInventory táblázatban a SalesOrderDetail táblázat. A példa rögzíti a frissített sorokat, és beszúrja őket egy másik táblába, amelyet a készletváltozások nyomon követésére használnak.

E. A MERGE használatával INSERT vagy UPDATE egy célél tábla egy grafikon adatbázisban

Ebben a példában csomópont táblákat hoz létre Person és City és egy éltábla livesIn. Használja a MERGE utasítást a livesIn élen, és helyezzen be egy új sort, ha az él már nem létezik egy Person és City. Ha az él már létezik, akkor csak frissítse a StreetAddress attribútumot a livesIn élen.

Lásd még

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük