Joinhinweise (Transact-SQL)-Hints (Transact-SQL) - Join

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Joinhinweise geben an, dass der Abfrageoptimierer eine Joinstrategie zwischen zwei Tabellen in SQL Server 2017SQL Server 2017 erzwingt.Join hints specify that the query optimizer enforce a join strategy between two tables in SQL Server 2017SQL Server 2017. Allgemeine Informationen zu Joins und joinsyntaxen finden Sie unter FROM ( Transact-SQL ) .For general information about joins and join syntax, see FROM (Transact-SQL).

Wichtig

Da die SQL ServerSQL Server Abfrageoptimierer in der Regel den optimalen Ausführungsplan für eine Abfrage auswählt, wird empfohlen, die Hinweise, einschließlich <Join_hint >, nur als letzte Möglichkeit verwendet werden, die von erfahrenen Entwicklern und Datenbankadministratoren.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints, including <join_hint>, be used only as a last resort by experienced developers and database administrators.

Gilt für:Applies to:

DELETEDELETE

SELECTSELECT

UPDATEUPDATE

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax


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

ArgumenteArguments

LOOP | HASH | MERGELOOP | HASH | MERGE
Legt fest, dass der Join in der Abfrage Schleifen, Hashing oder Zusammenführen verwenden soll.Specifies that the join in the query should use looping, hashing, or merging. Durch die Verwendung von LOOP | HASH | MERGE JOIN wird ein bestimmter Join zwischen zwei Tabellen erzwungen.Using LOOP |HASH | MERGE JOIN enforces a particular join between two tables. LOOP kann nicht zusammen mit RIGHT oder FULL als Jointyp angegeben werden.LOOP cannot be specified together with RIGHT or FULL as a join type.

REMOTEREMOTE
Gibt an, dass der Joinvorgang am Standort der rechten Tabelle ausgeführt wird.Specifies that the join operation is performed on the site of the right table. Dies ist hilfreich, falls die linke Tabelle eine lokale und die rechte eine Remotetabelle ist.This is useful when the left table is a local table and the right table is a remote table. REMOTE sollte nur dann verwendet werden, wenn die linke Tabelle weniger Datensätze als die rechte Tabelle enthält.REMOTE should be used only when the left table has fewer rows than the right table.

Ist die rechte Tabelle lokal, wird der Join lokal ausgeführt.If the right table is local, the join is performed locally. Falls beide Tabellen Remotetabellen sind, aber aus verschiedenen Datenquellen stammen, bewirkt REMOTE den Join am Standort der rechten Tabelle.If both tables are remote but from different data sources, REMOTE causes the join to be performed on the site of the right table. Wenn beide Tabellen Remotetabellen aus der gleichen Datenquelle sind, ist die Angabe von REMOTE nicht notwendig.If both tables are remote tables from the same data source, REMOTE is not required.

REMOTE kann nicht verwendet werden, wenn einer der Werte, die im Joinprädikat verglichen werden, mithilfe der COLLATE-Klausel in eine andere Sortierung umgewandelt wird.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.

REMOTE kann nur für INNER JOIN-Vorgänge verwendet werden.REMOTE can be used only for INNER JOIN operations.

HinweiseRemarks

Joinhinweise werden in der FROM-Klausel einer Abfrage angegeben.Join hints are specified in the FROM clause of a query. Sie erzwingen eine Joinstrategie zwischen zwei Tabellen.Join hints enforce a join strategy between two tables. Falls ein Joinhinweis für zwei beliebige Tabellen angegeben ist, erzwingt der Abfrageoptimierer automatisch die Joinreihenfolge für alle verknüpften Tabellen der Abfrage abhängig von der Position der ON-Schlüsselwörter.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. Wird CROSS JOIN ohne die ON-Klausel verwendet, kann die Joinreihenfolge mithilfe von Klammern angegeben werden.When a CROSS JOIN is used without the ON clause, parentheses can be used to indicate the join order.

BeispieleExamples

A.A. Verwenden von HASHUsing HASH

Im folgenden Beispiel wird der JOIN-Vorgang in der Abfrage durch einen HASH-Join ausgeführt.The following example specifies that the JOIN operation in the query is performed by a HASH join. Im Beispiel wird die AdventureWorks2012AdventureWorks2012-Datenbank verwendet.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. Verwenden von LOOPUsing LOOP

Im folgenden Beispiel wird der JOIN-Vorgang in der Abfrage durch einen LOOP-Join ausgeführt.The following example specifies that the JOIN operation in the query is performed by a LOOP join. Im Beispiel wird die AdventureWorks2012AdventureWorks2012-Datenbank verwendet.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. Verwenden von MERGEUsing MERGE

Im folgenden Beispiel wird der JOIN-Vorgang in der Abfrage durch einen MERGE-Join ausgeführt.The following example specifies that the JOIN operation in the query is performed by a MERGE join. Im Beispiel wird die AdventureWorks2012AdventureWorks2012-Datenbank verwendet.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  

Siehe auchSee Also

Tabellenhinweise ( Transact-SQL )Hints (Transact-SQL)