Hint (Transact-SQL) - JoinHints (Transact-SQL) - Join

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure noAzure SQL Data Warehouse noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Gli hint di join specificano che Query Optimizer deve imporre una strategia di join tra due tabelle in SQL Server 2017SQL Server 2017.Join hints specify that the query optimizer enforce a join strategy between two tables in SQL Server 2017SQL Server 2017. Per informazioni generali sui join e sulla relativa sintassi, vedere FROM (Transact-SQL).For general information about joins and join syntax, see FROM (Transact-SQL).

Attenzione

Poiché Query Optimizer di SQL ServerSQL Server consente in genere di selezionare 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.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

Si applica a:Applies to:

DELETEDELETE

SELECTSELECT

UPDATEUPDATE

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

  
<join_hint> ::=   
     { LOOP | HASH | MERGE | REMOTE }  

ArgomentiArguments

LOOP | HASH | MERGELOOP | HASH | MERGE
Specifica che il join della query deve essere un join ciclico, hash o di merge.Specifies that the join in the query should use looping, hashing, or merging. L'utilizzo delle opzioni LOOP | HASH | MERGE consente di applicare un join specifico tra due tabelle.Using LOOP |HASH | MERGE JOIN enforces a particular join between two tables. Non è possibile specificare LOOP come tipo di join insieme a RIGHT o FULL.LOOP cannot be specified together with RIGHT or FULL as a join type.

REMOTEREMOTE
Specifica che l'operazione di join viene eseguita nella posizione della tabella di destra.Specifies that the join operation is performed on the site of the right table. Ciò risulta utile quando la tabella di sinistra è una tabella locale e la tabella di destra è una tabella remota.This is useful when the left table is a local table and the right table is a remote table. Utilizzare l'opzione REMOTE solo quando il numero di righe della tabella di sinistra è inferiore a quello della tabella di destra.REMOTE should be used only when the left table has fewer rows than the right table.

Se la tabella di destra è locale, il join viene eseguito localmente.If the right table is local, the join is performed locally. Se entrambe le tabelle sono remote ma l'origine dei dati è diversa, con l'opzione REMOTE il join viene eseguito nella posizione della tabella di destra.If both tables are remote but from different data sources, REMOTE causes the join to be performed on the site of the right table. Se entrambe le tabelle sono tabelle remote dalla stessa origine dei dati, l'opzione REMOTE non è necessaria.If both tables are remote tables from the same data source, REMOTE is not required.

Non è possibile utilizzare l'opzione REMOTE quando per uno dei valori confrontati nel predicato di join viene eseguito il casting su regole di confronto diverse tramite la clausola COLLATE.REMOTE cannot be used when one of the values being compared in the join predicate is cast to a different collation using the COLLATE clause.

L'opzione REMOTE può essere utilizzata solo per operazioni INNER JOIN.REMOTE can be used only for INNER JOIN operations.

RemarksRemarks

Gli hint di join vengono specificati nella clausola FROM di una queryJoin hints are specified in the FROM clause of a query. e consentono di imporre una strategia di join tra due tabelle.Join hints enforce a join strategy between two tables. Se tra due tabelle viene specificato un hint di join, Query Optimizer impone in modo automatico l'ordine di join per tutte le tabelle unite in join della query, in base alla posizione delle parole chiave ON.If a join hint is specified for any two tables, the query optimizer automatically enforces the join order for all joined tables in the query, based on the position of the ON keywords. Se si utilizza un CROSS JOIN senza la clausola ON, è possibile utilizzare le parentesi per indicare l'ordine di join.When a CROSS JOIN is used without the ON clause, parentheses can be used to indicate the join order.

EsempiExamples

A.A. Utilizzo di HASHUsing HASH

Nell'esempio seguente viene specificato che l'operazione JOIN nella query viene eseguita da un join HASH.The following example specifies that the JOIN operation in the query is performed by a HASH join. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

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.B. Utilizzo di LOOPUsing LOOP

Nell'esempio seguente viene specificato che l'operazione JOIN nella query viene eseguita da un join LOOP.The following example specifies that the JOIN operation in the query is performed by a LOOP join. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

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.C. Utilizzo di MERGEUsing MERGE

Nell'esempio seguente viene specificato che l'operazione JOIN nella query viene eseguita da un join MERGE.The following example specifies that the JOIN operation in the query is performed by a MERGE join. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

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  

Vedere ancheSee Also

Hint (Transact-SQL)Hints (Transact-SQL)