適用於:sql Server
Azure SQL 資料庫 Azure SQL 受控執行個體
Microsoft Fabric Microsoft Fabric
SQL 資料庫中Microsoft網狀架構倉儲中的 SQL 分析端點
聯結提示會指定查詢最佳化工具強制執行 SQL Server 中兩份資料表之間的聯結策略。 如需聯結和聯結語法的一般資訊,請參閱 FROM子句加上 JOIN、APPLY、PIVOT。
Caution
由於 SQL Server 查詢最佳化工具通常會選取最好的查詢執行計劃,因此我們建議只有資深的開發人員和資料庫管理員才應該使用提示,並將其當作最後的解決辦法。
適用對象
Syntax
<join_hint> ::=
{ LOOP | HASH | MERGE | REMOTE | REDUCE | REPLICATE | REDISTRIBUTE [(columns count)]}
Arguments
{ LOOP |HASH |MERGE }
適用於: Azure SQL Database、Azure SQL Managed Instance、SQL Analytics endpoint、Microsoft Fabric 中的 SQL 資料庫、Microsoft Fabric Warehouse
指定查詢中的聯結應該使用迴圈、雜湊或合併。 使用 LOOP、 HASH或 MERGE JOIN 會強制執行兩個數據表之間的特定聯結。
LOOP 不能與 RIGHT 或 FULL 一起指定為聯結類型。 如需詳細資訊,請參閱聯結。
REMOTE
適用於: Azure SQL Database, Azure SQL Managed Instance, SQL Analytics endpoint, Microsoft Fabric 中的 SQL database
指定在右資料表上執行聯結作業。 當左資料表是本機資料表,右資料表是遠端資料表時,這非常有用。
REMOTE 只有當左數據表的數據列少於右邊的數據表時,才應該使用。
如果右資料表是本機資料表,則聯結會在本機執行。 如果這兩個數據表都是遠端數據表,但來自不同數據源, REMOTE 則會導致聯結在正確的數據表站台上執行。 如果這兩個數據表都是來自相同數據源的遠程數據表, REMOTE 則不需要。
REMOTE 當聯結述詞中要比較的其中一個值使用 子句轉換成不同的定序時,就無法使用 COLLATE 。
REMOTE 只能用於 INNER JOIN 作業。
REDUCE
適用於: Azure Synapse Analytics and Analytics Platform System (PDW)
減少要針對聯結右方資料表移動的資料列數量,以便讓兩個散發不相容資料表變成相容。 REDUCE 提示也稱為半聯結提示。
REPLICATE
適用於: Azure Synapse Analytics、Analytics Platform System (PDW),Microsoft網狀架構倉儲
導致廣播移動作業,其中特定數據表要跨所有散發節點複寫。
- 使用
REPLICATE搭配INNER或LEFT聯結,廣播移動作業會將聯結的右側復寫到所有節點。 - 同樣地,使用
REPLICATE搭配RIGHT聯結時,廣播移動作業會將聯結的左側復寫到所有節點。 - 搭配
REPLICATE聯結使用FULL時,無法建立估計計劃。
重新分配 [(columns_count)]
適用於: Azure Synapse Analytics and Analytics Platform System (PDW)
強制將兩個資料來源散發在 JOIN 子句中所指定的資料行上。 針對分散式數據表,Analytics Platform System (PDW) 會在這兩個數據表的第一個數據行上執行隨機移動。針對復寫的數據表,Analytics Platform System (PDW) 會執行修剪移動。 若要了解這些移動類型,請參閱 Analytics Platform System (PDW) 產品文件中的《了解查詢計劃》一文內的<DMS 作業查詢計劃>一節。 當查詢計劃使用廣播移動來解決散發不相容聯結的問題時,此提示可以改善效能。
適用於: Microsoft網狀架構倉儲
REDISTRIBUTE 提示可確保根據子句數據行 JOIN 散發兩個數據源。 它會處理這兩個數據表中第一個 n 個 數據行所指定的多個聯結條件,其中 n 是 column_count 自變數。 在中繼執行步驟期間,轉散發數據會優化查詢效能,方法是將數據平均分散到節點。
(columns_count) 自變數只有在網狀架構倉儲Microsoft才支援。
Remarks
聯結提示是在查詢的 子句中 FROM 指定。 聯結提示會強制執行兩份資料表之間的聯結策略。 如果為任兩個數據表指定聯結提示,查詢優化器會根據關鍵詞的位置,自動強制執行查詢中所有聯結數據表的 ON 聯結順序。
CROSS JOIN在沒有 子句的情況下ON使用 時,括弧可用來指出聯結順序。
Examples
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。
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