結合ヒント (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

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

Caution

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

対象

Transact-SQL 構文表記規則

Syntax

<join_hint> ::=
     { LOOP | HASH | MERGE | REMOTE | REDUCE | REPLICATE | REDISTRIBUTE [(columns count)]}

Arguments

{ ループ |ハッシュ | MERGE }

適用対象: Azure SQL Database、Azure SQL Managed Instance、Microsoft Fabric の SQL 分析エンドポイント、Microsoft Fabric の SQL データベース、Microsoft Fabric の Microsoft Fabric Warehouse

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

REMOTE

適用対象: Azure SQL Database、Azure SQL Managed Instance、Microsoft Fabric の SQL 分析エンドポイント、Microsoft Fabric の SQL データベース

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

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

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

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

REDUCE

適用対象:Azure Synapse Analytics

2 つの配布互換性のないテーブルを互換にするため、結合の右側にあるテーブルに移動する行の数を減らします。 REDUCE ヒントは、semi-join ヒントとも呼ばれます。

REPLICATE

適用対象:Azure Synapse Analytics、Microsoft Fabric Warehouse in Microsoft Fabric

ブロードキャスト移動操作を実行します。この操作では、特定のテーブルがすべての配布ノードにレプリケートされます。

  • REPLICATE 結合または INNER 結合で LEFT を使用すると、ブロードキャスト移動操作によって結合の右側がすべてのノードにレプリケートされます。
  • 同様に、REPLICATE 結合で RIGHT を使用すると、ブロードキャスト移動操作によって結合の左側がすべてのノードにレプリケートされます。
  • REPLICATE 結合で FULL を使用する場合、推定プランを作成できません。

再分配[(columns_count)]

適用対象:Azure Synapse Analytics

2 つのデータ ソースの、JOIN 句で指定された列への配布を強制します。 分散テーブルの場合、Azure Synapse Analyticsは両方のテーブルの最初の列に対してシャッフルムーブを実行します。レプリケートテーブルの場合、Azure Synapse Analyticsはトリムムーブを実行します。 このヒントは、クエリ プランで BROADCAST_MOVE を使用して配布互換性のない結合を解決する際のパフォーマンスを向上させることができます。

適用対象: Microsoft Fabric の Microsoft Fabric Warehouse

REDISTRIBUTE ヒントを使用すると、句列に基づいて 2 つのデータ ソース JOIN 分散できます。 両方のテーブルの最初の n 個の 列で指定された複数の結合条件を処理します。ここで、ncolumn_count 引数です。 データを再配布すると、実行中の中間ステップでノード間でデータが均等に分散されるため、クエリのパフォーマンスが最適化されます。

(columns_count)引数は、Microsoft Fabric の Microsoft Fabric Warehouse でのみサポートされます。

Remarks

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

Examples

この記事のコードサンプルは、Azure Data SQL Samples Repository GitHub repositoryからダウンロードできるAdventureWorks2025またはAdventureWorksDW2025サンプルデータベースを使用しています。

A. ハッシュを使いましょう

次の例では、クエリの 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

D. REDUCE 結合ヒントの例

次の例では、REDUCE 結合ヒントを使用して、クエリ内で派生テーブルの処理を変更します。 REDUCE 結合ヒントを使用する場合、fis.ProductKey は予測され、レプリケートされ、区別した後、DimProduct での DimProduct のシャッフル中に ProductKey に結合されます。 結果として得られる派生テーブルは、fis.ProductKey に配布されます。

-- Uses AdventureWorks
  
SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REDUCE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

E. REPLICATE 結合ヒントの例

次の例は、前の例と同じクエリを示していますが、REPLICATE 結合ヒントの代わりに REDUCE 結合ヒントを使用している点が異なります。 REPLICATE ヒントを使用すると、ProductKey テーブルの FactInternetSales (結合) 列の値がすべてのノードにレプリケートされます。 DimProduct テーブルは、これらの値のレプリケートされたバージョンに結合されます。

-- Uses AdventureWorks

SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REPLICATE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

F. REDISTRIBUTE ヒントを使用して、配布互換性のある結合に SHUFFLE_MOVE を保証する

次のクエリでは、ディストリビューションの互換性のない結合に対して REDISTRIBUTE クエリ ヒントを使用します。 これにより、クエリ オプティマイザーがクエリ プランで SHUFFLE_MOVE を使用することが保証されます。 また、クエリ プランで分散テーブルをレプリケートされたテーブルに移動する、BROADCAST_MOVE を使用しないことも保証されます。

次の例では、REDISTRIBUTE ヒントは、FactInternetSalesProductKeyのディストリビューション列であり、DimProductのディストリビューション列ではないので、FactInternetSales テーブルでシャッフル移動を強制します。

-- Uses AdventureWorks
  
SELECT dp.ProductKey,
    fis.SalesOrderNumber,
    fis.TotalProductCost
FROM DimProduct AS dp
INNER REDISTRIBUTE JOIN FactInternetSales AS fis
    ON dp.ProductKey = fis.ProductKey;

G. REDISTRIBUTE ヒントで列数引数を使用する

次のクエリでは、REDISTRIBUTE クエリ ヒントと列数引数が使用され、シャッフルは結合内の各テーブルの最初の 4 列で実行されます。

SELECT * FROM DA
INNER REDISTRIBUTE (4) JOIN DB
ON DA.a1 = DB.b1