次の方法で共有


結合ヒント (Transact-SQL)

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

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

注意事項

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

適用対象

Transact-SQL 構文表記規則

構文

<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

クエリ内の結合は、ループ、ハッシュ、またはマージを使用します。 LOOPHASH、または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 個の 列で指定された複数の結合条件を処理します。ここで、ncolumn_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 ヒントは、ProductKeyDimProductのディストリビューション列であり、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