Sdílet prostřednictvím


Rady spojení (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed Instancekoncový bod analytiky SQL v Microsoft FabricWarehouse v Microsoft Fabricdatabázi SQL v Microsoft Fabric

Nápovědy pro spojení určují, že optimalizátor dotazů vynucuje strategii spojení mezi dvěma tabulkami v SQL Serveru. Obecné informace o spojení a syntaxi spojení naleznete v tématu KLAUZULE FROM plus JOIN, APPLY, PIVOT.

Upozornění

Vzhledem k tomu, že optimalizátor dotazů SQL Serveru obvykle vybírá nejlepší plán provádění dotazu, doporučujeme, aby se rady používaly pouze jako poslední možnost zkušenými vývojáři a správci databází.

Vztahuje se na

Transact-SQL konvence syntaxe

Syntaxe

<join_hint> ::=
     { LOOP | HASH | MERGE | REMOTE | REDUCE | REPLICATE | REDISTRIBUTE [(columns count)]}

Argumenty

{ LOOP | HASH | MERGE }

platí pro: Azure SQL Database, Azure SQL Managed Instance, koncový bod analýzy SQL, databáze SQL v Microsoft Fabric, Microsoft Fabric Warehouse

Určuje, že spojení v dotazu by mělo používat smyčky, hashování nebo slučování. Použití LOOP, HASHnebo MERGE JOIN vynucuje konkrétní spojení mezi dvěma tabulkami. LOOP nelze zadat společně s RIGHT nebo FULL jako typ spojení. Další informace naleznete v tématu Spojení.

VZDÁLENÝ

platí pro: Azure SQL Database, Azure SQL Managed Instance, koncový bod analýzy SQL, databáze SQL v Microsoft Fabric

Určuje, že operace spojení se provádí na webu pravé tabulky. To je užitečné, když je levá tabulka místní a pravá tabulka je vzdálená tabulka. REMOTE byste měli použít jenom v případě, že levá tabulka obsahuje méně řádků než pravá tabulka.

Pokud je správná tabulka místní, spojení se provede místně. Pokud jsou obě tabulky vzdálené, ale z různých zdrojů dat, REMOTE způsobí, že se spojení provede na webu správné tabulky. Pokud obě tabulky jsou vzdálené tabulky ze stejného zdroje dat, REMOTE není potřeba.

REMOTE nelze použít, pokud se jedna z hodnot porovnávaných v predikátu spojení přetypuje na jinou kolaci pomocí klauzule COLLATE.

REMOTE lze použít pouze pro operace INNER JOIN.

REDUKOVAT

platí pro: Azure Synapse Analytics a Analytics Platform System (PDW)

Zmenšuje počet řádků, které se mají přesunout pro tabulku na pravé straně spojení, aby byly dvě distribuce nekompatibilní tabulky kompatibilní. Tip REDUCE se také označuje jako tip pro střední spojení.

REPLIKOVAT

platí pro: Azure Synapse Analytics, Analytics Platform System (PDW), Microsoft Fabric Warehouse

Způsobí operaci přesunutí všesměrového vysílání, kdy se konkrétní tabulka replikuje napříč všemi distribučními uzly.

  • Použití REPLICATE s INNER nebo LEFT spojení, operace přesunu vysílání replikuje pravou stranu spojení do všech uzlů.
  • Podobně při použití REPLICATE s RIGHT spojení bude operace přesunutí vysílání replikovat levou stranu spojení do všech uzlů.
  • Při použití REPLICATE s FULL spojení nelze vytvořit odhadovaný plán.

REDISTRIBUTE [(columns_count)]

platí pro: Azure Synapse Analytics a Analytics Platform System (PDW)

Vynutí rozdělení dvou zdrojů dat do sloupců zadaných v klauzuli JOIN. U distribuované tabulky provádí analytický systém (PDW) přesun na prvním sloupci obou tabulek Pro replikovanou tabulku nástroj Analytics Platform System (PDW) oříznout. Informace o těchto typech přesunů najdete v části "Operace plánu dotazů DMS" v článku "Principy plánů dotazů" v dokumentaci k produktu Analytics Platform System (PDW). Tento tip může zvýšit výkon, když plán dotazu používá přesun vysílání k vyřešení distribuce nekompatibilní spojení.

platí pro: Microsoft Fabric Warehouse

Tip REDISTRIBUTE zajišťuje distribuci dvou zdrojů dat na základě sloupců klauzule JOIN. Zpracovává více podmínek spojení určených prvním n sloupců v obou tabulkách, kde n je argument column_count. Redistribuce dat optimalizuje výkon dotazů rovnoměrným rozložením dat mezi uzly během průběžných kroků provádění.

Argument (columns_count) je podporován pouze ve službě Microsoft Fabric Warehouse.

Poznámky

Nápovědy pro spojení jsou zadané v klauzuli FROM dotazu. Rady spojení vynucují strategii spojení mezi dvěma tabulkami. Pokud je pro jakékoli dvě tabulky zadán tip spojení, optimalizátor dotazů automaticky vynucuje pořadí spojení pro všechny spojené tabulky v dotazu na základě pozice ON klíčových slov. Pokud se CROSS JOIN použije bez klauzule ON, lze k označení pořadí spojení použít závorky.

Příklady

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2022 nebo AdventureWorksDW2022, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Použití hodnoty HASH

Následující příklad určuje, že operace JOIN v dotazu je provedena HASH spojení.

SELECT p.Name,
    pr.ProductReviewID
FROM Production.Product AS p
LEFT OUTER HASH JOIN Production.ProductReview AS pr
    ON p.ProductID = pr.ProductID
ORDER BY ProductReviewID DESC;

B. Použití smyčky

Následující příklad určuje, že operace JOIN v dotazu je provedena LOOP spojení.

DELETE
FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER LOOP JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO

C. Použití funkce MERGE

Následující příklad určuje, že operace JOIN v dotazu je provedena MERGE spojení.

SELECT poh.PurchaseOrderID,
    poh.OrderDate,
    pod.ProductID,
    pod.DueDate,
    poh.VendorID
FROM Purchasing.PurchaseOrderHeader AS poh
INNER MERGE JOIN Purchasing.PurchaseOrderDetail AS pod
    ON poh.PurchaseOrderID = pod.PurchaseOrderID;
GO

D. Příklad nápovědy ke spojení REDUCE

Následující příklad používá nápovědu REDUCE spojení ke změně zpracování odvozené tabulky v dotazu. Při použití nápovědy REDUCE spojení v tomto dotazu se fis.ProductKey promítnou, replikují a zvýrazní a pak připojí k DimProduct během náhodného prohazování DimProduct na ProductKey. Výsledná odvozená tabulka se distribuuje na fis.ProductKey.

-- Uses AdventureWorks
  
SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REDUCE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

E. Příklad nápovědy k replikaci spojení

Tento další příklad ukazuje stejný dotaz jako v předchozím příkladu s tím rozdílem, že místo nápovědy pro spojení REPLICATE se používá tip REDUCE spojení. Použití REPLICATE nápovědy způsobí, že se hodnoty ve sloupci ProductKey (spojování) z tabulky FactInternetSales replikují do všech uzlů. Tabulka DimProduct je připojená k replikované verzi těchto hodnot.

-- Uses AdventureWorks

SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REPLICATE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

F. Pomocí nápovědy k redistribuci zaručte přesun pro distribuci nekompatibilní spojení.

Následující dotaz používá REDISTRIBUTE nápovědu dotazu k distribuci nekompatibilního spojení. To zaručuje, že optimalizátor dotazů používá v plánu dotazu přesun shuffle. To také zaručuje, že plán dotazu nebude používat přesun všesměrového vysílání, který přesune distribuovanou tabulku do replikované tabulky.

V následujícím příkladu REDISTRIBUTE tip vynutí pohyb na FactInternetSales tabulce, protože ProductKey je distribuční sloupec pro DimProducta není distribučním sloupcem pro FactInternetSales.

-- Uses AdventureWorks
  
SELECT dp.ProductKey,
    fis.SalesOrderNumber,
    fis.TotalProductCost
FROM DimProduct AS dp
INNER REDISTRIBUTE JOIN FactInternetSales AS fis
    ON dp.ProductKey = fis.ProductKey;

G. Použití argumentu počet sloupců s nápovědou k redistribuci

Následující dotaz používá REDISTRIBUTE nápovědu dotazu s argumentem počet sloupců a náhodné prohazování probíhá napříč prvními čtyřmi sloupci každé tabulky ve spojení.

SELECT * FROM DA
INNER REDISTRIBUTE (4) JOIN DB
ON DA.a1 = DB.b1