ヒント (Transact-SQL) - Join

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

結合ヒントにより、クエリ オプティマイザーで、SQL Server の 2 つのテーブル間の結合方法を設定します。 結合および結合の構文に関する一般的な情報については、「FROM (Transact-SQL)」を参照してください。

注意事項

通常、SQL Server クエリ オプティマイザーでは、クエリにとって最適な実行プランが選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。

適用対象

Transact-SQL 構文表記規則

構文

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

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

LOOP | HASH | MERGE

クエリ内の結合は、ループ、ハッシュ、またはマージを使用します。 LOOP | HASH | MERGE JOIN を使用すると、2 つのテーブル間に特定の結合が設定されます。 LOOP は、RIGHT または FULL と共に結合の種類として指定することはできません。 詳細については、結合に関するページを参照してください。

REMOTE

右側のテーブルのサイトで結合操作を実行します。 これは、左側のテーブルがローカル テーブルで、右側のテーブルがリモート テーブルの場合に効果的です。 REMOTE は、左側のテーブルの行数が右側のテーブルの行数よりも少ないときだけ使用します。

右側のテーブルがローカルの場合、結合はローカルで実行されます。 両方のテーブルがリモート テーブルでデータ ソースは異なる場合、REMOTE の指定によって結合は右側のテーブルのサイトで実行されます。 両方のテーブルが同じデータ ソースのリモート テーブルの場合、REMOTE は必要ありません。

結合述語で比較されている値のいずれかを COLLATE 句を使用して別の照合順序にキャストする場合は、REMOTE を使用できません。

REMOTE は、INNER JOIN 操作に対してのみ使用できます。

解説

結合ヒントは、クエリの FROM 句で指定します。 結合ヒントにより、2 つのテーブル間の結合方法を設定できます。 2 つのテーブルに対して結合ヒントが指定されると、クエリ オプティマイザーは、ON キーワードの位置に基づいて、クエリ内のすべての結合テーブルに対して結合の順番を自動的に設定します。 ON 句を指定せずに CROSS JOIN を使用する場合は、かっこを使用して結合の順番を指定できます。

A. HASH を使用する

次の例では、クエリの JOIN 操作を HASH 結合によって実行することを指定します。 この例では、AdventureWorks2022 データベースを使います。

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. LOOP を使用する

次の例では、クエリの JOIN 操作を LOOP 結合によって実行することを指定します。 この例では、AdventureWorks2022 データベースを使います。

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. MERGE を使用する

次の例では、クエリの JOIN 操作を MERGE 結合によって実行することを指定します。 この例では、AdventureWorks2022 データベースを使います。

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  

参照

ヒント (Transact-SQL)