適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric の SQL データベース
結合ヒントにより、クエリ オプティマイザーで、SQL Server の 2 つのテーブル間の結合方法を設定します。 結合と結合構文に関する一般的な情報については、 FROM 句と JOIN、APPLY、PIVOT を参照してください。
Caution
通常、SQL Server クエリ オプティマイザーでは、クエリにとって最適な実行プランが選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。
対象
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
クエリ内の結合は、ループ、ハッシュ、またはマージを使用します。
LOOP、HASH、または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 個の 列で指定された複数の結合条件を処理します。ここで、n は column_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 ヒントは、FactInternetSales が ProductKeyのディストリビューション列であり、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