SLOUČENÍ (Transact-SQL)

  • 08/20/2019
  • 25 minut na čtení
    • X
    • c
    • j
    • r
    • a
    • +18

Platí pro: SQL Server (všechny podporované verze) Azure SQL Database Azure Synapse Analytics

Spustí operace vložení, aktualizace nebo odstranění v cílové tabulce z výsledky spojení se zdrojovou tabulkou. Například synchronizujte dvě tabulky vložením, aktualizací nebo odstraněním řádků v jedné tabulce na základě rozdílů nalezených v druhé tabulce.

Poznámka

SLOUČENÍ je aktuálně v náhledu pro Azure Synapse Analytics.

Tip na výkon: Podmíněné chování popsané pro příkaz SLOUČENÍ funguje nejlépe, když dvě tabulky mají složitou směs shodných charakteristik. Například vložení řádku, pokud neexistuje, nebo aktualizace řádku, pokud se shoduje. Při jednoduché aktualizaci jedné tabulky na základě řádků jiné tabulky můžete zlepšit výkon a škálovatelnost pomocí základních příkazů INSERT, UPDATE a DELETE. příklad:

Konvence syntaxe jazyka Transact-SQL

Syntaxe

Poznámka

Chcete-li zobrazit syntaxi Transact-SQL pro SQL Server 2014 a starší, přečtěte si dokumentaci Předchozí verze.

Argumenty

S < common_table_expression >
Určuje dočasně pojmenovanou sadu výsledků nebo pohled, známý také jako běžný výraz tabulky, který je definován v rozsahu prohlášení SLOUČENÍ. Sada výsledků je odvozena z jednoduchého dotazu a je odkazována příkazem SLOUČENÍ. Další informace najdete v tématu WITH common_table_expression (Transact-SQL).

TOP (výraz)
Určuje počet nebo procento ovlivněných řádků. výraz může být číslo nebo procento řádků. Řádky odkazované ve výrazu TOP nejsou uspořádány v žádném pořadí. Další informace najdete v tématu TOP (Transact-SQL).

Klauzule TOP se použije poté, co se připojí celá zdrojová tabulka a celá cílová tabulka a spojené řádky, které nesplňují podmínky pro vložení, aktualizaci nebo akce odstranění jsou odstraněny. Klauzule TOP dále snižuje počet spojených řádků na zadanou hodnotu. Akce vložení, aktualizace nebo odstranění se vztahují na zbývající spojené řádky neuspořádaným způsobem. To znamená, že neexistuje pořadí, ve kterém řádky jsou rozděleny mezi akce definované v klauzulích WHEN. Například zadání TOP (10) ovlivní 10 řádků. Z těchto řádků může být 7 aktualizováno a 3 vloženy, nebo 1 může být odstraněno, 5 aktualizováno a 4 vloženy atd.

Protože příkaz SLOUČENÍ provede úplnou kontrolu tabulky zdroje i zdroje cílové tabulky, výkon I / O je někdy ovlivněn při použití klauzule TOP k úpravě velké tabulky vytvořením více dávek. V tomto scénáři je důležité zajistit, aby všechny po sobě jdoucí dávky zacílily na nové řádky.

název_databáze
Název databáze, ve které se nachází tabulka_cíle.

název_schématu
Název schématu, ke kterému tabulka target_table patří.

target_table
Tabulka nebo pohled, proti kterému se datové řádky z < table_source > se shodují na základě < clause_search_condition >. target_table je cíl jakékoli operace vložení, aktualizace nebo odstranění specifikováno klauzulemi WHEN v prohlášení SLOUČENÍ.

Pokud je target_table pohled, jakékoli akce proti němu musí splňovat podmínky pro aktualizaci pohledů. Další informace najdete v části Upravit data pomocí pohledu.

target_table nemůže být vzdálená tabulka. tabulka target_table nemůže mít definována žádná pravidla.

table_alias
Alternativní název pro odkaz na tabulku tabulky target_table.

POUŽITÍ < table_source >
Určuje zdroj dat, který odpovídá datovým řádkům v target_table na základě < merge_search podmínky >. Výsledek této shody určuje akce, které mají být provedeny klauzulemi WHEN příkazu SLOUČENÍ. < table_source > může být vzdálená tabulka nebo odvozená tabulka, která přistupuje ke vzdáleným tabulkám.

< table_source > může být odvozená tabulka, která používá konstruktor hodnoty tabulky Transact-SQL k vytvoření tabulky zadáním více řádků.

table_alias
Alternativní název pro odkaz na tabulku pro zdroj table_source.

Další informace o syntaxi a argumentech této klauzule najdete v části FROM (Transact-SQL).

ZAPNUTO < merge_search_condition >
Určuje podmínky, za kterých < table_source > se připojí k tabulce target_table a určí, kde se shodují.

Pozor

Je důležité zadat pouze sloupce z cílové tabulky, které se mají použít pro účely shody. To znamená, uveďte sloupce z cílové tabulky, které se porovnávají s odpovídajícím sloupcem zdrojové tabulky. Nepokoušejte se zlepšit výkon dotazu odfiltrováním řádků v cílové tabulce v klauzule ON; například zadáním AND NOT target_table.column_x = value. Pokud tak učiníte, může dojít k neočekávaným a nesprávným výsledkům.

KDY DOHLED POTOM < merge_matched >
Určuje, že všechny řádky * target_table, které odpovídají řádkům vráceným < table_source > ON < merge_search_condition > a splňují všechny další podmínky vyhledávání, jsou aktualizovány nebo odstraněny podle < merge_matched > klauzule.

Příkaz SLOUČENÍ může mít maximálně dvě klauzule WHEN MATCHED. Pokud jsou zadány dvě klauzule, musí být k první klauzuli připojena klauzule AND < search_condition >. Pro jakýkoli daný řádek se druhá klauzule WHEN MATCHED použije pouze v případě, že první není „t. Pokud existují dvě klauzule WHEN MATCHED, je třeba určit akci UPDATE a jednu akci DELETE. Když je v části < merge_matched > klauzule a více než jeden řádek < table_source > odpovídá řádku v tabulce target_table na základě < merge_search_condition >, SQL Server vrátí chybu. Příkaz MERGE může“ t aktualizovat stejný řádek vícekrát, nebo aktualizovat a mazat stejný řádek.

KDYŽ SE NEDODRŽÍ POTOM < merge_not_matched >
Určuje, že je do cílové tabulky vložen řádek pro každý řádek vrácený < table_source > ZAPNUTO < merge_search_condition >, který neodpovídá řádku v targu et_table, ale splňuje další podmínku hledání, pokud je k dispozici. Hodnoty, které se mají vložit, jsou specifikovány v klauzuli < merge_not_matched >. Příkaz SLOUČENÍ může mít pouze jednu klauzuli KDYŽ SE NEDODRŽÍ.

KDYŽ SE NEDODRŽÍ ZDROJ POTOM < merge_matched >
Určuje, že všechny řádky * target_table, které neodpovídají řádkům vráceným < table_source > ZAPNUTO < merge_search_condition >, které splňují jakékoli další podmínky hledání, jsou aktualizovány nebo odstraněny podle < merge_matched > klauzule.

Příkaz SLOUČENÍ může mít maximálně dvě klauzule KDYŽ NENÍ SOUVISEJÍCÍ SOURCE. Pokud jsou zadány dvě klauzule, musí být k první klauzuli připojeno klauzule AND < clause_search_condition >. Pro jakýkoli daný řádek se druhá klauzule WHEN NOT MATCHED BY SOURCE použije, pouze pokud první není t. Pokud existují dvě klauzule WHEN NOT MATCHED BY SOURCE, pak je třeba určit akci UPDATE a druhou akci DELETE. V < clause_search_condition > lze odkazovat pouze na sloupce z cílové tabulky.

Když evrací žádné řádky < table_source >, ke sloupcům ve zdrojové tabulce nelze přistupovat. Pokud akce aktualizace nebo odstranění uvedená v < merge_matched > klauzule odkazuje na sloupce ve zdrojové tabulce, je vrácena chyba 207 (neplatný název sloupce). Například klauzule WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 může způsobit selhání příkazu, protože Col1 ve zdrojové tabulce je nepřístupný.

AND < clause_search_condition >
Určuje jakoukoli platnou podmínku hledání. Další informace naleznete v části Podmínka hledání (Transact-SQL).

< table_hint_limited >
Určuje jeden nebo více tipů k tabulce, které se použijí v cílové tabulce pro každou z Vložit, aktualizovat nebo odstranit akce provedené příkazem SLOUČENÍ. Klíčové slovo WITH a závorky jsou povinné.

NOLOCK a READUNCOMMITTED nejsou povoleny. Další informace o radách k tabulkám najdete v tématu Rady k tabulkám (Transact-SQL).

Určení nápovědy TABLOCK v tabulce, která je cílem příkazu INSERT, má stejný účinek jako určení nápovědy TABLOCKX. V tabulce je použit exkluzivní zámek. Když je zadán FORCESEEK, vztahuje se na implicitní instance cílové tabulky spojené se zdrojovou tabulkou.

Upozornění

Zadání READPASTu, KDYŽ NENÍ SOUVISEJÍCÍ POTOM INSERT, může mít za následek operace INSERT, které porušují UNIQUE omezení.

INDEX (index_val)
Určuje název nebo ID jednoho nebo více indexů v cílové tabulce pro implicitní spojení se zdrojovou tabulkou. Další informace najdete v části Tipy k tabulce (Transact -SQL).

< output_clause >
Vrátí řádek pro každý řádek v tabulce target_table, který je aktualizovány, vloženy nebo odstraněny v žádném konkrétním pořadí. $ action lze specifikovat ve výstupní klauzuli. $ action je sloupec typu nvarchar (10), který vrací jednu ze tří hodnot pro každý řádek: „INSERT“, „UPDATE“ nebo „DELETE“ podle akce provedené na daném řádku. Další informace o argumentech a chování této klauzule najdete v klauzuli OUTPUT (Transact-SQL).

< merge_matched >
Určuje akci aktualizace nebo odstranění, která se použije na všechny řádky tabulky target_table, které neodpovídají řádkům vráceným < table_source > ZAPNUTO < merge_search_condition >, které splňují všechny další podmínky vyhledávání.

AKTUALIZACE < set_clause >
Určuje seznam názvů sloupců nebo proměnných, které se mají v cílové tabulce aktualizovat, a hodnoty, pomocí kterých se mají aktualizovat.

Další informace o argumentech této klauzule naleznete v části UPDATE (Transact-SQL). Nastavení proměnné na stejnou hodnotu jako sloupec není podporováno.

ODSTRANIT
Určuje, že řádky odpovídající řádkům v tabulce target_table budou odstraněny.

< merge_not_matched >
Určuje hodnoty, které se mají vložit do cílové tabulky.

(column_list)
Seznam jednoho nebo více sloupců cílové tabulky, do které se mají vložit data. Sloupce musí být zadány jako název jedné části, jinak selže příkaz SLOUČENÍ. column_list musí být uzavřen v závorkách a oddělen čárkami.

HODNOTY ( values_list)
Čárkami oddělený seznam konstant, proměnných nebo výrazů, které vracejí hodnoty k vložení do cílové tabulky. Výrazy nemohou obsahovat příkaz EXECUTE.

DEFAULT VALUES
Vynutí vložený řádek, aby obsahoval výchozí hodnoty definované pro každý sloupec.

Další informace o této klauzuli najdete v INSERT (Transact-SQL).

< search_condition >
Druh fies the search conditions to specify < merge_search_condition > or < clause_search_condition >. Další informace o argumentech pro tuto klauzuli najdete v části Podmínka hledání (Transact-SQL).

< vzor pro vyhledávání grafů >
Určuje vzor shody grafu. Další informace o argumentech pro tuto klauzuli najdete v části MATCH (Transact-SQL)

Poznámky

Poznámka

V Azure Synapse Analytics, SLOUČENÍ příkaz (náhled) má ve srovnání se serverem SQL a databází Azure SQL následující rozdíly.

  • SLOUČENÁ aktualizace je implementována jako dvojice odstranění a vložení. Počet ovlivněných řádků pro aktualizaci SLOUČENÍ zahrnuje odstraněné a vložené řádky.
  • Během náhledu nejsou tabulky se sloupcem identity podporovány příkazem Synapse SQL MERGE.
  • Podpora pro tabulky s různými typy distribuce jsou popsány v této tabulce:

Sloučení klauzule v Azure Synapse Analytics Podporovaná distribuční tabulka TARGE Podporovaná distribuční tabulka ZDROJ Komentovat
KDY MATCHED Všechny typy distribuce Všechny typy distribuce
NENÍ SOUVISEJÍCÍ S CÍLEM HASH Všechny typy distribuce K aktualizaci dvou tabulek použijte UPDATE / DELETE FROM… JOIN.
NEDODRŽENO ZDROJEM Všechny typy distribuce Všechny typy distribuce

Musí být zadána alespoň jedna ze tří klauzulí MATCHED, ale lze je zadat v libovolném pořadí. Proměnnou nelze ve stejné klauzuli MATCHED aktualizovat více než jednou.

Jakákoli akce vložení, aktualizace nebo odstranění určená v cílové tabulce příkazem SLOUČENÍ je omezena jakýmikoli omezeními v ní definovanými, včetně jakýchkoli kaskádových omezení referenční integrity. Pokud je IGNORE_DUP_KEY zapnuto pro všechny jedinečné indexy v cílové tabulce, MERGE toto nastavení ignoruje.

Příkaz MERGE vyžaduje středník (;) jako zakončení příkazu. Při spuštění příkazu SLOUČENÍ bez terminátoru je vyvolána chyba 10713.

Při použití po Sloučení vrátí @@ ROWCOUNT (Transact-SQL) celkový počet řádků vložených, aktualizovaných a odstraněných klientovi.

SLOUČENÍ je plně vyhrazené klíčové slovo, když je úroveň kompatibility databáze nastavena na 100 nebo vyšší. Příkaz SLOUČENÍ je k dispozici na 90 i 100 úrovních kompatibility databáze; klíčové slovo však není plně rezervováno, pokud je úroveň kompatibility databáze nastavena na 90.

Nepoužívejte příkaz SLOUČIT při použití replikace ve frontě. Spouštěcí sloučení SLOUČENÍ a aktualizace ve frontě nejsou kompatibilní. Nahraďte příkaz SLOUČENÍ příkazem vložení nebo aktualizací.

Implementace spouštění

U každé akce vložení, aktualizace nebo odstranění uvedené v příkaz SLOUČENÍ, SQL Server spustí všechny odpovídající PO aktivační události definované v cílové tabulce, ale nezaručuje, která akce se má aktivovat jako první nebo poslední. Spouštěče definované pro stejnou akci ctí vámi zadané pořadí. Další informace o nastavení pořadí spouštění spouštěčů najdete v části Určení prvního a posledního spouštěče.

Pokud má cílová tabulka v ní definovanou povolenou INSTEAD OF spoušť pro akci vložení, aktualizace nebo odstranění provedenou příkazem SLOUČENÍ , musí mít povolený spouštěč INSTEAD OF pro všechny akce uvedené v příkazu SLOUČENÍ.

Pokud jsou na target_table definovány nějaké spouštěče INSTEAD OF UPDATE nebo INSTEAD OF DELETE, operace aktualizace nebo mazání nejsou t místo toho se aktivují spouštěče a vložené a odstraněné tabulky se potom vyplní odpovídajícím způsobem.

Pokud jsou na target_table definovány nějaké INSTEAD OF INSERT spouštěče, operace vložení se neprovede. Místo toho se tabulka vyplní odpovídajícím způsobem.

Oprávnění

Vyžaduje oprávnění SELECT u zdrojové tabulky a oprávnění INSERT, UPDATE nebo DELETE u cílové tabulky. Další informace najdete v části Oprávnění v článcích SELECT, INSERT, UPDATE a DELETE.

Optimalizace výkonu příkazu SLOUČENÍ

Pomocí příkazu SLOUČENÍ můžete nahradit jednotlivé DML výpisy s jediným výpisem. To může zlepšit výkon dotazu, protože operace se provádějí v rámci jediného příkazu, proto se minimalizuje počet zpracovávání dat ve zdrojové a cílové tabulce. Zvýšení výkonu však závisí na zavedení správných indexů, spojení a dalších úvah.

Doporučené postupy pro indexování

Chcete-li zlepšit výkon příkazu SLOUČENÍ, doporučujeme následující pokyny pro indexování :

  • Vytvořte index ve sloupcích spojení ve zdrojové tabulce, který je jedinečný a krycí.
  • Vytvořte jedinečný seskupený index ve sloupcích spojení v cílové tabulce.

Tyto indexy zajišťují, že klíče spojení jsou jedinečné a data v tabulkách jsou tříděna. Výkon dotazu je vylepšen, protože optimalizátor dotazů nemusí provádět další zpracování ověřování, aby vyhledal a aktualizoval duplicitní řádky, a nejsou nutné další operace řazení.

PŘIPOJTE se k doporučeným postupům

Chcete-li vylepšit výkon příkazu SLOUČENÍ a zajištění správných výsledků, doporučujeme následující pokyny pro připojení:

  • Určete pouze podmínky hledání v ON < merge_search_condition > klauzule, která určuje kritéria pro shodu dat ve zdrojové a cílové tabulce. To znamená, zadat pouze sloupce z cílové tabulky, které jsou porovnány s odpovídajícími sloupci zdrojové tabulky.
  • Nezahrnujte srovnání s jinými hodnotami, jako je konstanta.

Chcete-li odfiltrovat řádky ze zdrojové nebo cílové tabulky, použijte jednu z následujících metod.

  • V příslušné klauzuli WHEN zadejte podmínku hledání pro filtrování řádků. Například KDYŽ NENÍ SOUVISEJÍCÍ A S.EmployeeName LIKE „S%“ PAK VLOŽTE ….
  • Definujte pohled na zdroj nebo cíl, který vrací filtrované řádky, a odkazujte na pohled jako na zdroj nebo cíl stůl. Pokud je pohled definován v cílové tabulce, všechny akce proti němu musí splňovat podmínky pro aktualizaci pohledů. Další informace o aktualizaci dat pomocí zobrazení najdete v části Úpravy dat prostřednictvím zobrazení.
  • Pomocí klauzule WITH <common table expression> odfiltrujte řádky ze zdrojové nebo cílové tabulky . Tato metoda je podobná zadání dalších vyhledávacích kritérií v klauzuli ON a může způsobit nesprávné výsledky. Doporučujeme nepoužívat tuto metodu nebo před její implementací důkladně otestovat.

Operace spojení v příkazu SLOUČENÍ je optimalizována stejným způsobem jako spojení v příkazu SELECT. To znamená, že když SQL Server zpracovává spojení, optimalizátor dotazů zvolí nejefektivnější metodu (z několika možností) zpracování spojení. Pokud jsou zdroj a cíl podobné velikosti a výše popsané pokyny pro indexování se použijí na zdrojové a cílové tabulky, je nejúčinnějším plánem dotazu operátor sloučení spojení. Důvodem je, že obě tabulky jsou skenovány jednou a není nutné data třídit. Pokud je zdroj menší než cílová tabulka, je vhodnější operátor vnořených smyček.

Použití konkrétního spojení můžete vynutit zadáním klauzule OPTION (<query_hint>) v prohlášení SLOUČENÍ. Doporučujeme nepoužívat hašovací spojení jako nápovědu pro dotaz SLOUČENÍ, protože tento typ spojení nepoužívá indexy.

Doporučené postupy pro parametrizaci

Pokud je vybrán příkaz SELECT, INSERT, UPDATE nebo je příkaz DELETE proveden bez parametrů, může se optimalizátor dotazů serveru SQL Server rozhodnout interně parametrizovat příkaz. To znamená, že všechny doslovné hodnoty obsažené v dotazu jsou nahrazeny parametry. Například příkaz INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), může být implementován interně jako INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Tento proces, nazývaný jednoduchá parametrizace, zvyšuje schopnost relačního enginu porovnávat nové příkazy SQL s existujícími dříve zkompilovanými plány provádění. Může se zlepšit výkon dotazu, protože se sníží frekvence kompilací dotazů a rekompilací. Optimalizátor dotazů nepoužije jednoduchý proces parametrizace na příkazy SLOUČENÍ. Proto příkazy SLOUČENÍ, které obsahují doslovné hodnoty, nemusí fungovat stejně dobře jako jednotlivé příkazy INSERT, UPDATE nebo DELETE, protože při každém provedení příkazu SLOUČENÍ je kompilován nový plán.

Chcete-li zlepšit výkon dotazu, doporučujeme následující pokyny pro parametrizaci:

  • Parametrizujte všechny doslovné hodnoty v klauzuli ON <merge_search_condition> a v WHEN klauzule prohlášení SLOUČENÍ. Například můžete začlenit příkaz SLOUČENÍ do uložené procedury a nahradit doslovné hodnoty příslušnými vstupními parametry.
  • Pokud nemůžete parametr parametrizovat, vytvořte průvodce plánem typu TEMPLATE a v průvodci plánem zadejte PARAMETERIZATION FORCED nápovědu k dotazu.
  • Pokud se příkazy SLOUČENÍ v databázi provádějí často, zvažte nastavení možnosti PARAMETERIZACE na databáze FORCED. Při nastavování této možnosti buďte opatrní. Možnost PARAMETERIZATION je nastavení na úrovni databáze a ovlivňuje způsob, jakým jsou zpracovávány všechny dotazy týkající se databáze.

Doporučené postupy klauzule TOP klauzule

V příkazu SLOUČENÍ určuje klauzule TOP počet nebo procento řádků, které jsou ovlivněny po připojení zdrojové tabulky k cílové tabulce a po odebrání řádků, které nesplňují podmínky pro akci vložení, aktualizace nebo odstranění . Klauzule TOP dále snižuje počet spojených řádků na zadanou hodnotu a akce vložení, aktualizace nebo odstranění se u zbývajících spojených řádků použijí neuspořádaným způsobem. To znamená, že neexistuje pořadí, ve kterém jsou řádky distribuovány mezi akce definované v klauzulích WHEN. Například zadání TOP (10) ovlivní 10 řádků; z těchto řádků může být 7 aktualizováno a 3 vloženy, nebo 1 může být odstraněno, 5 aktualizováno a 4 vloženy atd.

Je běžné používat klauzuli TOP k provádění jazyka pro manipulaci s daty (DML ) operace na velkém stole v dávkách. Pokud pro tento účel použijete klauzuli TOP v prohlášení SLOUČENÍ, je důležité pochopit následující důsledky.

  • Může být ovlivněn výkon I / O.

    Příkaz SLOUČENÍ provede úplné prohledání tabulky zdrojové i cílové tabulky. Rozdělení operace na dávky snižuje počet operací zápisu prováděných na dávku; každá dávka však provede úplnou kontrolu tabulky zdrojové a cílové tabulky. Výsledná aktivita čtení může ovlivnit výkon dotazu.

  • Mohou nastat nesprávné výsledky.

    Je důležité zajistit, aby všechny následné dávky cílily na nové řádky nebo může dojít k nežádoucímu chování, jako je nesprávné vložení duplicitních řádků do cílové tabulky. K tomu může dojít, když zdrojová tabulka obsahuje řádek, který nebyl v cílové dávce, ale byl v celkové cílové tabulce.

  • Pro zajištění správných výsledků:

    • Pomocí klauzule ON určete, které zdrojové řádky ovlivňují existující cílové řádky a které jsou skutečně nové.
    • Použijte další podmínku v klauzuli WHEN MATCHED a určete, zda cílový řádek již byl aktualizován předchozí dávka.

Protože klauzule TOP se použije až po použití těchto klauzulí, každé spuštění buď vloží jeden skutečně nesrovnaný řádek, nebo aktualizuje jeden existující řádek.

Doporučené postupy pro hromadné načítání

Příkaz SLOUČENÍ lze použít k efektivnímu hromadnému načtení dat ze souboru zdrojových dat do cílové tabulky zadáním klauzule OPENROWSET(BULK…) jako zdroj tabulky. Tímto způsobem bude celý soubor zpracován v jedné dávce.

Chcete-li zlepšit výkon procesu hromadného sloučení, doporučujeme následující pokyny:

  • Vytvořte seskupený index na sloupcích spojení v cílové tabulce.

  • Pomocí upřesnění ORDER a UNIQUE v klauzuli OPENROWSET(BULK…) určete jak je zdrojový datový soubor tříděn.

    Ve výchozím nastavení předpokládá hromadná operace datový soubor neuspořádaný. Proto je důležité, aby se zdrojová data seřadila podle seskupeného indexu v cílové tabulce a aby se k označení pořadí použila nápověda OBJEDNÁVKA, aby optimalizátor dotazů mohl generovat efektivnější plán dotazů. Rady jsou ověřeny za běhu; pokud datový proud neodpovídá zadaným radám, dojde k chybě.

Tyto pokyny zajišťují, že klíče spojení jsou jedinečné a pořadí řazení dat v zdrojový soubor odpovídá cílové tabulce. Výkon dotazu je vylepšen, protože nejsou nutné další operace řazení a nejsou vyžadovány zbytečné kopie dat.

Měření a diagnostika SLOUČENÍ výkonu

Následující funkce vám pomohou při měření a diagnostice výkon příkazů SLOUČENÍ.

  • Pomocí čítače sloučení stmt v zobrazení dynamické správy sys.dm_exec_query_optimizer_info můžete vrátit počet optimalizací dotazů, které jsou pro příkazy SLOUČENÍ.
  • Použít atribut merge_action_type v pohledu dynamické správy sys.dm_exec_plan_attributes pro vrácení typu plánu provádění spouštěče použitého jako výsledek příkazu SLOUČENÍ.
  • Pomocí nástroje SQL Trace shromážděte data řešení potíží pro příkaz SLOUČENÍ stejným způsobem byste pro jiné příkazy jazyka manipulace s daty (DML). Další informace najdete v tématu trasování SQL.

Příklady

A. Použití SLOUČENÍ k provádění operací INSERT a UPDATE v tabulce v jediném příkazu

Běžným scénářem je aktualizace jednoho nebo více sloupců v tabulce, pokud existuje odpovídající řádek. Nebo vložení dat jako nového řádku, pokud odpovídající řádek neexistuje. Obvykle provedete oba scénáře předáním parametrů uložené proceduře, která obsahuje příslušné příkazy UPDATE a INSERT. S příkazem SLOUČENÍ můžete provádět oba úkoly v jeden příkaz. Následující příklad ukazuje uloženou proceduru v AdventureWorks2012database, která obsahuje příkaz INSERT i příkaz UPDATE. Postup je poté upraven tak, aby spouštěl ekvivalentní operace pomocí jediného příkazu SLOUČENÍ.

B . Použití MERGE k provedení operací UPDATE a DELETE v tabulce v jediném příkazu

Následující příklad používá MERGE k aktualizaci tabulky ProductInventory v ukázkové databázi AdventureWorks2012, denně, na základě objednávek zpracovaných v tabulce SalesOrderDetail. Sloupec Quantity ProductInventory se aktualizuje odečtením počtu objednávek zadaných každý den pro každý produkt v SalesOrderDetail tabulka. Pokud počet objednávek produktu klesne na úroveň inventáře produktu na 0 nebo méně, řádek pro daný produkt bude odstraněn z ProductInventory tabulky.

C. Použití SLOUČENÍ k provádění operací UPDATE a INSERT v cílové tabulce pomocí odvozené zdrojové tabulky

Následující příklad používá SLOUČENÍ k úpravě tabulky SalesReason v databázi AdventureWorks2012 aktualizací nebo vložením řádků. Když se hodnota NewName ve zdrojové tabulce shoduje s hodnotou ve sloupci Name cílové tabulky, (SalesReason), sloupec ReasonType je v cílové tabulce aktualizován. Když se hodnota NewName neodpovídá, zdrojový řádek se vloží do cílové tabulky. Zdrojovou tabulkou je odvozená tabulka, která používá konstruktor hodnoty tabulky Transact-SQL k určení více řádky pro zdrojovou tabulku. Další informace o použití konstruktoru hodnoty tabulky v odvozené tabulce najdete v konstruktoru hodnoty tabulky (Transact-SQL). Příklad také ukazuje, jak uložit výsledky klauzule OUTPUT do proměnné tabulky. A, poté shrnete výsledky příkazu SLOUČENÍ spuštěním jednoduché operace výběru, která vrátí počet vložených a aktualizovaných řádků.

D.Vložení výsledků příkazu SLOUČENÍ do jiné tabulky

Následující příklad zachycuje data vrácená z klauzule OUTPUT příkazu SLOUČENÍ a tato data vloží do jiné tabulky. Příkaz SLOUČENÍ aktualizuje sloupec Quantity tabulky ProductInventory v databázi AdventureWorks2012 na základě objednávek zpracovaných v SalesOrderDetail tabulka. Příklad zachycuje aktualizované řádky a vloží je do jiné tabulky, která slouží ke sledování změn inventáře.

E. Pomocí SLOUČENÍ proveďte INSERT nebo UPDATE na tabulka cílového okraje v databázi grafů

V tomto příkladu vytvoříte tabulky uzlů Person a City a okrajová tabulka livesIn. Na hraně livesIn použijete příkaz Sloučit a vložíte nový řádek, pokud hrana již mezi a Person a City. Pokud hrana již existuje, stačí aktualizovat atribut StreetAddress na hraně livesIn.

Viz také

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *