聯結提示 (Transact-SQL)

適用於:sql Server Azure SQL 資料庫 Azure SQL 受控執行個體 Microsoft Fabric Microsoft Fabric SQL 資料庫中Microsoft網狀架構倉儲中的 SQL 分析端點

聯結提示會指定查詢最佳化工具強制執行 SQL Server 中兩份資料表之間的聯結策略。 如需聯結和聯結語法的一般資訊,請參閱 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 資料庫、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL 分析端點、Microsoft Fabric 中的 SQL 資料庫、Microsoft Fabric 中的 Microsoft Fabric Warehouse

指定查詢中的聯結應該使用迴圈、雜湊或合併。 使用 LOOP、 HASH或 MERGE JOIN 會強制執行兩個數據表之間的特定聯結。 LOOP 不能與 RIGHT 或 FULL 一起指定為聯結類型。 如需詳細資訊,請參閱聯結。

REMOTE

適用於: Azure SQL Database、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL Analytics endpoint、Microsoft Fabric 中的 SQL 資料庫

指定在右資料表上執行聯結作業。 當左資料表是本機資料表,右資料表是遠端資料表時,這非常有用。 REMOTE 只有當左數據表的數據列少於右邊的數據表時,才應該使用。

如果右資料表是本機資料表,則聯結會在本機執行。 如果這兩個數據表都是遠端數據表,但來自不同數據源, REMOTE 則會導致聯結在正確的數據表站台上執行。 如果這兩個數據表都是來自相同數據源的遠程數據表, REMOTE 則不需要。

REMOTE 當聯結述詞中要比較的其中一個值使用 子句轉換成不同的定序時,就無法使用 COLLATE 。

REMOTE 只能用於 INNER JOIN 作業。

REDUCE

適用於:Azure Synapse Analytics

減少要針對聯結右方資料表移動的資料列數量,以便讓兩個散發不相容資料表變成相容。 REDUCE 提示也稱為半聯結提示。

REPLICATE

適用於:Azure Synapse Analytics、Microsoft Fabric 中的 Microsoft Fabric 倉庫

導致廣播移動作業,其中特定數據表要跨所有散發節點複寫。

  • 使用 REPLICATE 搭配 INNER 或 LEFT 聯結,廣播移動作業會將聯結的右側復寫到所有節點。
  • 同樣地,使用 REPLICATE 搭配 RIGHT 聯結時,廣播移動作業會將聯結的左側復寫到所有節點。
  • 搭配 REPLICATE 聯結使用 FULL 時,無法建立估計計劃。

重新分配 [(columns_count)]

適用於:Azure Synapse Analytics

強制將兩個資料來源散發在 JOIN 子句中所指定的資料行上。 對於分散式資料表,Azure Synapse Analytics 會對兩個資料表的第一欄執行洗牌移動。對於複製的表格,Azure Synapse Analytics 會執行修剪移動。 當查詢計劃使用廣播移動來解決散發不相容聯結的問題時,此提示可以改善效能。

適用於: Microsoft Fabric 倉庫中的 Microsoft Fabric 倉庫

REDISTRIBUTE 提示可確保根據子句數據行 JOIN 散發兩個數據源。 它會處理這兩個數據表中第一個 n 個 數據行所指定的多個聯結條件,其中 n 是 column_count 自變數。 在中繼執行步驟期間,轉散發數據會優化查詢效能,方法是將數據平均分散到節點。

這個 (columns_count) 論點只在 Microsoft Fabric 中的 Microsoft Fabric Warehouse 中得到支持。

Remarks

聯結提示是在查詢的 子句中 FROM 指定。 聯結提示會強制執行兩份資料表之間的聯結策略。 如果為任兩個數據表指定聯結提示,查詢優化器會根據關鍵詞的位置,自動強制執行查詢中所有聯結數據表的 ON 聯結順序。 CROSS JOIN在沒有 子句的情況下ON使用 時,括弧可用來指出聯結順序。

Examples

本文的程式碼範例使用AdventureWorks2025了 、 AdventureWorksDW2025或AdventureWorksLT2025範例資料庫,你可以從 Azure Data SQL 範例庫 GitHub 下載。

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 提示來確保針對散發不相容聯結使用隨機移動

下列查詢會在散發不相容聯結上使用 REDISTRIBUTE 查詢提示。 這可確保查詢最佳化工具會在查詢計劃中使用隨機移動。 此外,也可確保查詢計劃不會使用將分散式資料表移至複寫資料表的廣播移動。

在下列範例中,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. 搭配使用columns count自變數與REDISTRIBUTE提示

下列查詢會使用具有 columns count 自變數的 REDISTRIBUTE 查詢提示,而隨機顯示會跨聯結中每個數據表的前四個數據行進行。

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