Hint di join (Transact-SQL)
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di SQL di Azure
Endpoint di analisi SQL in Microsoft Fabric
Warehouse in Microsoft Fabric
Database 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
, HASH
o 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 joinINNER
oLEFT
, l'operazione di spostamento della trasmissione replica il lato destro del join in tutti i nodi. - Analogamente, quando si usa
REPLICATE
con un joinRIGHT
, l'operazione di spostamento della trasmissione replica il lato sinistro del join in tutti i nodi. - Quando si usa
REPLICATE
con un joinFULL
, 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 DimProduct
e 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