結合ヒント (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric のSQL データベース
結合ヒントにより、クエリ オプティマイザーで、SQL Server の 2 つのテーブル間の結合方法を設定します。 結合と結合構文に関する一般的な情報については、 FROM 句と JOIN、APPLY、PIVOT を参照してください。
注意事項
通常、SQL Server クエリ オプティマイザーでは、クエリにとって最適な実行プランが選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。
適用対象
構文
<join_hint> ::=
{ LOOP | HASH | MERGE | REMOTE | REDUCE | REPLICATE | REDISTRIBUTE [(columns count)]}
引数
{ LOOP |HASH |MERGE }
適用対象: Azure SQL Database、Azure SQL Managed Instance、SQL 分析エンドポイント、Microsoft Fabric の SQL データベース、Microsoft Fabric Warehouse
クエリ内の結合は、ループ、ハッシュ、またはマージを使用します。
LOOP
、HASH
、またはMERGE JOIN
を使用すると、2 つのテーブル間に特定の結合が適用されます。
LOOP
は、結合の種類として RIGHT
または FULL
と共に指定することはできません。 詳細については、結合に関するページを参照してください。
REMOTE
適用対象: Azure SQL Database、Azure SQL Managed Instance、SQL 分析エンドポイント、Microsoft Fabric の SQL データベース
右側のテーブルのサイトで結合操作を実行します。 これは、左側のテーブルがローカル テーブルで、右側のテーブルがリモート テーブルの場合に効果的です。
REMOTE
は、左側のテーブルの行数が右側のテーブルよりも少ない場合にのみ使用してください。
右側のテーブルがローカルの場合、結合はローカルで実行されます。 両方のテーブルがリモートであっても、データ ソースが異なる場合、 REMOTE
により、適切なテーブルのサイトで結合が実行されます。 両方のテーブルが同じデータ ソースのリモート テーブルである場合、 REMOTE
は必要ありません。
REMOTE
結合述語で比較される値の 1 つが、 COLLATE
句を使用して別の照合順序にキャストされている場合は使用できません。
REMOTE
は、 INNER JOIN
操作にのみ使用できます。
REDUCE
適用対象: azure Synapse Analytics and Analytics Platform System (PDW)
2 つの配布互換性のないテーブルを互換にするため、結合の右側にあるテーブルに移動する行の数を減らします。 REDUCE ヒントは、semi-join ヒントとも呼ばれます。
REPLICATE
適用対象: Azure Synapse Analytics、Analytics Platform System (PDW)、Microsoft Fabric Warehouse
ブロードキャスト移動操作を実行します。この操作では、特定のテーブルがすべての配布ノードにレプリケートされます。
-
INNER
結合またはLEFT
結合でREPLICATE
を使用すると、ブロードキャスト移動操作によって結合の右側がすべてのノードにレプリケートされます。 - 同様に、
RIGHT
結合でREPLICATE
を使用すると、ブロードキャスト移動操作によって結合の左側がすべてのノードにレプリケートされます。 -
FULL
結合でREPLICATE
を使用する場合、推定プランを作成できません。
REDISTRIBUTE [(columns_count)]
適用対象: azure Synapse Analytics and Analytics Platform System (PDW)
2 つのデータ ソースの、JOIN 句で指定された列への配布を強制します。 分散テーブルの場合、Analytics Platform System (PDW) は、レプリケートされたテーブルの両方のテーブルの最初の列でシャッフル移動を実行し、Analytics Platform System (PDW) はトリミング移動を実行します。 これらの移動の種類を理解するには、Analytics Platform System (PDW) 製品ドキュメントにある "クエリ プランの概要" に関する記事の "DMS クエリ プランの操作" に関するセクションをご覧ください。 このヒントは、クエリ プランで BROADCAST_MOVE を使用して配布互換性のない結合を解決する際のパフォーマンスを向上させることができます。
適用対象: Microsoft Fabric Warehouse
REDISTRIBUTE
ヒントを使用すると、句列に基づいて 2 つのデータ ソース JOIN
分散できます。 両方のテーブルの最初の n 個の 列で指定された複数の結合条件を処理します。ここで、n は column_count
引数です。 データを再配布すると、実行中の中間ステップでノード間でデータが均等に分散されるため、クエリのパフォーマンスが最適化されます。
(columns_count)
引数は、Microsoft Fabric Warehouse でのみサポートされています。
解説
結合ヒントは、クエリの FROM
句で指定されます。 結合ヒントにより、2 つのテーブル間の結合方法を設定できます。 2 つのテーブルに結合ヒントが指定されている場合、クエリ オプティマイザーは、 ON
キーワードの位置に基づいて、クエリ内のすべての結合テーブルに対して結合順序を自動的に適用します。
CROSS JOIN
句なしでON
を使用する場合は、かっこを使用して結合順序を示すことができます。
例
この記事のコード サンプルでは、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
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
ヒントは、ProductKey
が DimProduct
のディストリビューション列であり、FactInternetSales
のディストリビューション列ではないので、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