Dela via


Kopplingstips (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric

Kopplingstips anger att frågeoptimeraren framtvingar en kopplingsstrategi mellan två tabeller i SQL Server. Allmän information om kopplingar och kopplingssyntax finns i FROM-sats plus JOIN, APPLY, PIVOT.

Försiktighet

Eftersom SQL Server-frågeoptimeraren vanligtvis väljer den bästa körningsplanen för en fråga rekommenderar vi att tips endast används som en sista utväg av erfarna utvecklare och databasadministratörer.

Gäller för

Transact-SQL syntaxkonventioner

Syntax

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

Argumenten

{ LOOP | HASH | MERGE }

gäller för: Azure SQL Database, Azure SQL Managed Instance, SQL Analytics-slutpunkt, SQL-databas i Microsoft Fabric, Microsoft Fabric Warehouse

Anger att kopplingen i frågan ska använda looping, hashing eller sammanslagning. Om du använder LOOP, HASHeller MERGE JOIN framtvingas en viss koppling mellan två tabeller. LOOP kan inte anges tillsammans med RIGHT eller FULL som kopplingstyp. Mer information finns i Kopplingar.

AVLÄGSEN

gäller för: Azure SQL Database, Azure SQL Managed Instance, SQL Analytics-slutpunkt, SQL-databas i Microsoft Fabric

Anger att kopplingsåtgärden utförs på platsen för den högra tabellen. Detta är användbart när den vänstra tabellen är en lokal tabell och den högra tabellen är en fjärrtabell. REMOTE bör endast användas när den vänstra tabellen har färre rader än den högra tabellen.

Om rätt tabell är lokal utförs kopplingen lokalt. Om båda tabellerna är fjärranslutna men från olika datakällor REMOTE att kopplingen utförs på platsen för den högra tabellen. Om båda tabellerna är fjärrtabeller från samma datakälla krävs inte REMOTE.

REMOTE kan inte användas när ett av värdena som jämförs i kopplingspredikatet omvandlas till en annan sortering med hjälp av COLLATE-satsen.

REMOTE kan endast användas för INNER JOIN åtgärder.

REDUCERA

gäller för: Azure Synapse Analytics and Analytics Platform System (PDW)

Minskar antalet rader som ska flyttas för tabellen till höger om kopplingen för att göra två distributionskompatibla tabeller kompatibla. REDUCE-tipset kallas även för ett tips om halvkoppling.

KOPIERA

gäller för: Azure Synapse Analytics, Analytics Platform System (PDW), Microsoft Fabric Warehouse

Orsakar en sändningsflyttåtgärd, där en specifik tabell replikeras över alla distributionsnoder.

  • Med hjälp av REPLICATE med en INNER eller LEFT koppling replikeras sändningsflyttningsåtgärden till höger om kopplingen till alla noder.
  • När du använder REPLICATE med en RIGHT koppling replikerar sändningsflyttningsåtgärden på samma sätt vänster sida av kopplingen till alla noder.
  • När du använder REPLICATE med en FULL koppling kan en uppskattad plan inte skapas.

REDISTRIBUTE [(columns_count)]

gäller för: Azure Synapse Analytics and Analytics Platform System (PDW)

Tvingar två datakällor att distribueras på kolumner som anges i JOIN-satsen. För en distribuerad tabell utför Analytics Platform System (PDW) en shuffle-flytt på den första kolumnen i båda tabellerna För en replikerad tabell utför Analytics Platform System (PDW) en trimningsflytt. Information om dessa flytttyper finns i avsnittet "DMS Query Plan Operations" i artikeln "Understanding Query Plans" (Förstå frågeplaner) i produktdokumentationen för Analytics Platform System (PDW). Det här tipset kan förbättra prestanda när frågeplanen använder en sändningsflytt för att lösa en distributionskompatibel koppling.

gäller för: Microsoft Fabric Warehouse

Tipset REDISTRIBUTE säkerställer att två datakällor distribueras baserat på JOIN-satskolumner. Den hanterar flera kopplingsvillkor, som anges av den första n kolumner i båda tabellerna, där n är argumentet column_count. Omdistribuering av data optimerar frågeprestanda genom att jämnt sprida data mellan noder under mellanliggande körningssteg.

Argumentet (columns_count) stöds endast i Microsoft Fabric Warehouse.

Anmärkningar

Kopplingstips anges i FROM-satsen i en fråga. Kopplingstips framtvingar en kopplingsstrategi mellan två tabeller. Om ett kopplingstips anges för två tabeller framtvingar frågeoptimeraren automatiskt kopplingsordningen för alla anslutna tabeller i frågan, baserat på positionen för nyckelorden ON. När en CROSS JOIN används utan ON-satsen kan parenteser användas för att ange kopplingsordningen.

Exempel

Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

A. Använda HASH

I följande exempel anges att den JOIN åtgärden i frågan utförs av en HASH koppling.

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. Använda LOOP

I följande exempel anges att den JOIN åtgärden i frågan utförs av en LOOP koppling.

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. Använda MERGE

I följande exempel anges att den JOIN åtgärden i frågan utförs av en MERGE koppling.

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. Exempel på REDUCE-kopplingstips

I följande exempel används REDUCE kopplingstips för att ändra bearbetningen av den härledda tabellen i frågan. När du använder REDUCE kopplingstipset i den här frågan projiceras, replikeras och görs fis.ProductKey distinkt och kopplas sedan till DimProduct under blandning av DimProductProductKey. Den resulterande härledda tabellen distribueras på 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. Exempel på REPLIKERingskopplingstips

I nästa exempel visas samma fråga som i föregående exempel, förutom att en REPLICATE kopplingstips används i stället för REDUCE kopplingstips. Användningen av REPLICATE tips gör att värdena i kolumnen ProductKey (sammanfoga) från FactInternetSales-tabellen replikeras till alla noder. Tabellen DimProduct är kopplad till den replikerade versionen av dessa värden.

-- 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. Använd REDISTRIBUTE-tipset för att garantera en shuffle-flytt för en distributionskompatibel koppling

Följande fråga använder REDISTRIBUTE frågetips för en distributionskompatibel koppling. Detta garanterar att frågeoptimeraren använder en Shuffle-flytt i frågeplanen. Detta garanterar också att frågeplanen inte använder en Broadcast-flytt, vilket flyttar en distribuerad tabell till en replikerad tabell.

I följande exempel tvingar REDISTRIBUTE-tipset en Shuffle-flytt på FactInternetSales-tabellen eftersom ProductKey är distributionskolumnen för DimProductoch inte är distributionskolumnen för 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. Använd argumentet för antal kolumner med REDISTRIBUTE-tipset

Följande fråga använder REDISTRIBUTE frågetips med argumentet antal kolumner och shuffle sker mellan de fyra första kolumnerna i varje tabell i kopplingen.

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