分享方式:


聯結提示 (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

聯結提示會指定查詢最佳化工具強制執行 SQL Server 中兩份資料表之間的聯結策略。 如需聯結和聯結語法的一般資訊,請參閱 FROM子句加上 JOIN、APPLY、PIVOT

警告

由於 SQL Server 查詢最佳化工具通常會選取最好的查詢執行計劃,因此我們建議只有資深的開發人員和資料庫管理員才應該使用提示,並將其當作最後的解決辦法。

適用於

Transact-SQL 語法慣例

Syntax

<join_hint> ::=
     { LOOP | HASH | MERGE | REMOTE }

注意

若要檢視 SQL Server 2014 (12.x) 和更早版本的 Transact-SQL 語法,請參閱舊版文件

引數

{ LOOP |HASH |MERGE }

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

REMOTE

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

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

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

REMOTE 只能用於 INNER JOIN 作業。

備註

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

範例

本文中的 Transact-SQL 程式代碼範例會使用 AdventureWorks2022AdventureWorksDW2022 範例資料庫,您可以從 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