結合ヒント (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
結合ヒントにより、クエリ オプティマイザーで、SQL Server の 2 つのテーブル間の結合方法を設定します。 結合と結合構文に関する一般的な情報については、 FROM 句と JOIN、APPLY、PIVOT を参照してください。
注意事項
通常、SQL Server クエリ オプティマイザーでは、クエリにとって最適な実行プランが選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。
適用対象
構文
<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
は必要ありません。
REMOTE
結合述語で比較される値の 1 つが、 COLLATE
句を使用して別の照合順序にキャストされている場合は使用できません。
REMOTE
は、 INNER JOIN
操作にのみ使用できます。
解説
結合ヒントは、クエリの FROM
句で指定されます。 結合ヒントにより、2 つのテーブル間の結合方法を設定できます。 2 つのテーブルに結合ヒントが指定されている場合、クエリ オプティマイザーは、 ON
キーワードの位置に基づいて、クエリ内のすべての結合テーブルに対して結合順序を自動的に適用します。 ON
句なしでCROSS JOIN
を使用する場合は、かっこを使用して結合順序を示すことができます。
例
この記事の Transact-SQL コード サンプルは AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。
A. HASH を使用する
次の例では、クエリの 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. LOOP を使用する
次の例では、クエリの 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: MERGE を使用する
次の例では、クエリの 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