聯結提示 (Transact-SQL)
適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 分析端點
Microsoft Fabric 中的倉儲
Microsoft Fabric 中的 SQL 資料庫
聯結提示會指定查詢最佳化工具強制執行 SQL Server 中兩份資料表之間的聯結策略。 如需聯結和聯結語法的一般資訊,請參閱 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 受控實例、SQL 分析端點、Microsoft網狀架構中的 SQL 資料庫、Microsoft網狀架構倉儲
指定查詢中的聯結應該使用迴圈、雜湊或合併。 使用 LOOP
、 HASH
或 MERGE JOIN
會強制執行兩個數據表之間的特定聯結。
LOOP
不能與 RIGHT
或 FULL
一起指定為聯結類型。 如需詳細資訊,請參閱聯結。
REMOTE
適用於: Azure SQL Database、Azure SQL 受控實例、SQL 分析端點、Microsoft Fabric 中的 SQL 資料庫
指定在右資料表上執行聯結作業。 當左資料表是本機資料表,右資料表是遠端資料表時,這非常有用。
REMOTE
只有當左數據表的數據列少於右邊的數據表時,才應該使用。
如果右資料表是本機資料表,則聯結會在本機執行。 如果這兩個數據表都是遠端數據表,但來自不同數據源, REMOTE
則會導致聯結在正確的數據表站台上執行。 如果這兩個數據表都是來自相同數據源的遠程數據表, REMOTE
則不需要。
REMOTE
當聯結述詞中要比較的其中一個值使用 子句轉換成不同的定序時,就無法使用 COLLATE
。
REMOTE
只能用於 INNER JOIN
作業。
減少
適用於: Azure Synapse Analytics and Analytics Platform System (PDW)
減少要針對聯結右方資料表移動的資料列數量,以便讓兩個散發不相容資料表變成相容。 REDUCE 提示也稱為半聯結提示。
複製
適用於: Azure Synapse Analytics、Analytics Platform System (PDW),Microsoft網狀架構倉儲
導致廣播移動作業,其中特定數據表要跨所有散發節點複寫。
- 使用
REPLICATE
搭配INNER
或LEFT
聯結,廣播移動作業會將聯結的右側復寫到所有節點。 - 同樣地,使用
REPLICATE
搭配RIGHT
聯結時,廣播移動作業會將聯結的左側復寫到所有節點。 - 搭配
FULL
聯結使用REPLICATE
時,無法建立估計計劃。
轉散發套件 [(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才支援。
備註
聯結提示是在查詢的 子句中 FROM
指定。 聯結提示會強制執行兩份資料表之間的聯結策略。 如果為任兩個數據表指定聯結提示,查詢優化器會根據關鍵詞的位置,自動強制執行查詢中所有聯結數據表的 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 提示來確保針對散發不相容聯結使用隨機移動
下列查詢會在散發不相容聯結上使用 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