聯結提示 (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體
聯結提示會指定查詢最佳化工具強制執行 SQL Server 中兩份資料表之間的聯結策略。 如需聯結和聯結語法的一般資訊,請參閱 FROM子句加上 JOIN、APPLY、PIVOT。
警告
由於 SQL Server 查詢最佳化工具通常會選取最好的查詢執行計劃,因此我們建議只有資深的開發人員和資料庫管理員才應該使用提示,並將其當作最後的解決辦法。
適用於
語法
<join_hint> ::=
{ LOOP | HASH | MERGE | REMOTE }
引數
{ LOOP |HASH |MERGE }
指定查詢中的聯結應該使用迴圈、雜湊或合併。 使用 LOOP
、 HASH
或 MERGE JOIN
會強制執行兩個數據表之間的特定聯結。 LOOP
不能與 RIGHT
或 FULL
一起指定為聯結類型。 如需詳細資訊,請參閱聯結。
REMOTE
指定在右資料表上執行聯結作業。 當左資料表是本機資料表,右資料表是遠端資料表時,這非常有用。 REMOTE
只有當左數據表的數據列少於右邊的數據表時,才應該使用。
如果右資料表是本機資料表,則聯結會在本機執行。 如果這兩個數據表都是遠端數據表,但來自不同數據源, REMOTE
則會導致聯結在正確的數據表站台上執行。 如果這兩個數據表都是來自相同數據源的遠程數據表, REMOTE
則不需要。
REMOTE
當聯結述詞中要比較的其中一個值使用 子句轉換成不同的定序時,就無法使用 COLLATE
。
REMOTE
只能用於 INNER JOIN
作業。
備註
聯結提示是在查詢的 子句中 FROM
指定。 聯結提示會強制執行兩份資料表之間的聯結策略。 如果為任兩個數據表指定聯結提示,查詢優化器會根據關鍵詞的位置,自動強制執行查詢中所有聯結數據表的 ON
聯結順序。 CROSS JOIN
在沒有 子句的情況下ON
使用 時,括弧可用來指出聯結順序。
範例
本文 Transact-SQL 程式碼範例使用 AdventureWorks2022
或 AdventureWorksDW2022
範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (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