Condividi tramite


Hint di join (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureEndpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft FabricDatabase SQL in Microsoft Fabric

Gli hint di join specificano che Query Optimizer deve imporre una strategia di join tra due tabelle in SQL Server. Per informazioni generali sui join e sulla sintassi di join, vedere clausola FROM più JOIN, APPLY, PIVOT.

Attenzione

Poiché Query Optimizer di SQL Server seleziona in genere il piano di esecuzione migliore per una query, gli hint devono essere usati solo se strettamente necessari ed esclusivamente da sviluppatori e amministratori di database esperti.

Si applica a

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

{ LOOP | HASH | MERGE }

si applica a: database SQL di Azure, Istanza gestita di SQL di Azure, endpoint di analisi SQL, database SQL in Microsoft Fabric, Microsoft Fabric Warehouse

Specifica che il join della query deve essere un join ciclico, hash o di merge. L'utilizzo di LOOP, HASHo MERGE JOIN impone un join specifico tra due tabelle. LOOP non può essere specificato insieme a RIGHT o FULL come tipo di join. Per altre informazioni, vedere Join.

REMOTE

si applica a: database SQL di Azure, Istanza gestita di SQL di Azure, endpoint di analisi SQL, database SQL in Microsoft Fabric

Specifica che l'operazione di join viene eseguita nella posizione della tabella di destra. Ciò risulta utile quando la tabella di sinistra è una tabella locale e la tabella di destra è una tabella remota. REMOTE deve essere utilizzato solo quando la tabella a sinistra contiene meno righe rispetto alla tabella destra.

Se la tabella di destra è locale, il join viene eseguito localmente. Se entrambe le tabelle sono remote ma da origini dati diverse, REMOTE fa sì che il join venga eseguito nel sito della tabella corretta. Se entrambe le tabelle sono tabelle remote dalla stessa origine dati, REMOTE non è necessario.

REMOTE Non può essere usato quando uno dei valori confrontati nel predicato di join viene eseguito il cast a regole di confronto diverse usando la COLLATE clausola .

REMOTE può essere usato solo per INNER JOIN le operazioni.

RIDURRE

si applica a: Azure Synapse Analytics e il sistema della piattaforma di analisi (PDW)

Riduce il numero di righe da spostare per la tabella sul lato destro del join per rendere compatibili due tabelle non compatibili di distribuzione. L'hint REDUCE è chiamato anche hint di semi-join.

REPLICARE

si applica a: Azure Synapse Analytics, Piattaforma di analisi (PDW), Microsoft Fabric Warehouse

Fa sì che un'operazione di spostamento broadcast, in cui una tabella specifica venga replicata in tutti i nodi di distribuzione.

  • Usando REPLICATE con un join INNER o LEFT, l'operazione di spostamento della trasmissione replica il lato destro del join in tutti i nodi.
  • Analogamente, quando si usa REPLICATE con un join RIGHT, l'operazione di spostamento della trasmissione replica il lato sinistro del join in tutti i nodi.
  • Quando si usa REPLICATE con un join FULL, non è possibile creare un piano stimato.

REDISTRIBUTE [(columns_count)]

si applica a: Azure Synapse Analytics e il sistema della piattaforma di analisi (PDW)

Forza la distribuzione di due origini dati nelle colonne specificate nella clausola JOIN. Per una tabella distribuita, Analytics Platform System (PDW) esegue uno spostamento casuale sulla prima colonna di entrambe le tabelle Per una tabella replicata, Analytics Platform System (PDW) esegue uno spostamento di taglio. Per comprendere questi tipi di spostamento, vedere la sezione "Operazioni del piano di query DMS" nell'articolo "Informazioni sui piani di query" nella documentazione del prodotto Analytics Platform System (PDW). Questo hint può migliorare le prestazioni quando il piano di query usa uno spostamento dei dati trasmessi per risolvere un join non compatibile di distribuzione.

si applica a: Microsoft Fabric Warehouse

L'hint REDISTRIBUTE assicura che due origini dati vengano distribuite in base alle colonne della clausola JOIN. Gestisce più condizioni di join, specificate dalla prima n colonne in entrambe le tabelle, dove n è l'argomento column_count. La ridistribuzione dei dati ottimizza le prestazioni delle query distribuendo uniformemente i dati tra i nodi durante i passaggi intermedi dell'esecuzione.

L'argomento (columns_count) è supportato solo in Microsoft Fabric Warehouse.

Osservazioni:

Gli hint di join vengono specificati nella FROM clausola di una query. e consentono di imporre una strategia di join tra due tabelle. Se viene specificato un hint di join per due tabelle, Query Optimizer applica automaticamente l'ordine di join per tutte le tabelle unite nella query, in base alla posizione delle ON parole chiave. Quando un oggetto CROSS JOIN viene utilizzato senza la ON clausola , è possibile utilizzare le parentesi per indicare l'ordine di join.

Esempi

Gli esempi di codice in questo articolo usano il database di esempio AdventureWorks2022 o AdventureWorksDW2022, che è possibile scaricare dalla home page Microsoft SQL Server Samples and Community Projects.

R. Usare HASH

Nell'esempio seguente viene specificato che l'operazione JOIN nella query viene eseguita da un join HASH.

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. Usare LOOP

Nell'esempio seguente viene specificato che l'operazione JOIN nella query viene eseguita da un join LOOP.

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. Usare MERGE

Nell'esempio seguente viene specificato che l'operazione JOIN nella query viene eseguita da un join MERGE.

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. Esempio di hint di join REDUCE

L'esempio seguente usa l'hint di join REDUCE per modificare l'elaborazione della tabella derivata all'interno della query. Quando si usa l'hint di join REDUCE in questa query, fis.ProductKey viene proiettato, replicato e differenziato e quindi unito a DimProduct durante lo spostamento casuale di DimProduct in ProductKey. La tabella derivata risultante viene distribuita in 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. Esempio di hint di join REPLICATE

L'esempio successivo illustra la stessa query dell'esempio precedente in cui viene usato un hint di join REPLICATE anziché l'hint di join REDUCE. L'uso dell'hint REPLICATE causa la replica dei valori della colonna ProductKey (di join) della tabella FactInternetSales in tutti i nodi. La tabella DimProduct viene unita alla versione replicata dei valori.

-- 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. Usare l'hint REDISTRIBUTE per garantire uno spostamento casuale per un join non compatibile con la distribuzione

La query seguente usa l'hint di query REDISTRIBUTE per un join non compatibile con la distribuzione. Ciò garantisce che Query Optimizer usi uno spostamento casuale nel piano di query. Ciò garantisce anche che il piano di query non usi uno spostamento broadcast, che sposta una tabella distribuita in una tabella replicata.

Nell'esempio seguente, l'hint REDISTRIBUTE forza lo spostamento casuale nella tabella FactInternetSales perché ProductKey è la colonna di distribuzione per DimProducte non è la colonna di distribuzione per 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. Usare l'argomento conteggio colonne con l'hint REDISTRIBUTE

La query seguente usa l'hint di query REDISTRIBUTE con l'argomento conteggio colonne e la sequenza casuale viene eseguita tra le prime quattro colonne di ogni tabella del join.

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