次の方法で共有


結合ヒント (Transact-SQL)

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

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

注意事項

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

適用対象

Transact-SQL 構文表記規則

構文

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

Note

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

引数

{ LOOP |HASH |MERGE }

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

REMOTE

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

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

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

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

解説

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

この記事の 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