結合ヒント (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

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

注意事項

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

適用対象

Transact-SQL 構文表記規則

構文

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

引数

{ LOOP |HASH |MERGE }

クエリ内の結合は、ループ、ハッシュ、またはマージを使用します。 LOOPHASH、または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