联接提示 (Transact-SQL)

联接提示用于指定查询优化器在两个表之间强制执行联接策略。

重要说明重要提示

由于 SQL Server 查询优化器通常为查询选择最佳执行计划,所以,建议只将提示(包括 <join_hint>)用作经验丰富的开发人员和数据库管理员的最终手段。

适用范围:

DELETE

SELECT

UPDATE

主题链接图标Transact-SQL 语法约定

语法

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

参数

  • LOOP | HASH | MERGE
    指定查询中的联接应使用循环、哈希或合并。使用 LOOP |HASH | MERGE JOIN 在两个表之间强制执行特定联接。不能同时将 LOOP 与 RIGHT(或 FULL)指定为联接类型。

  • REMOTE
    指定联接操作在右表处执行。这在左表是本地表而右表是远程表的情况下很有用。只在左表的行数少于右表行数时才能使用 REMOTE。

    如果右表为本地表,则联接在本地执行。如果两个表均为远程表但来自不同的数据源,则 REMOTE 将使联接在右表处执行。如果两个表均为远程表且来自相同数据源,则不需要使用 REMOTE。

    如果使用 COLLATE 子句将联接谓词中比较的值中的一个值转换成了不同的排序规则,则不能使用 REMOTE。

    REMOTE 只可用于 INNER JOIN 操作。

注释

联接提示在查询的 FROM 子句中指定。联接提示可以在两个表之间强制执行联接策略。如果为任意两个表指定了联接提示,查询优化器会根据 ON 关键字的位置,自动为查询中所有联接的表强制确定联接顺序。如果使用了不带 ON 子句的 CROSS JOIN,则可使用括号指示联接顺序。

示例

A. 使用 HASH

下面的示例指定查询中的 JOIN 操作由 HASH 联接执行。

USE AdventureWorks2008R2;
GO
SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER HASH JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID
ORDER BY ProductReviewID DESC;

B. 使用 LOOP

下面的示例指定查询中的 JOIN 操作由 LOOP 联接执行。

USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER LOOP JOIN Sales.SalesPerson AS sp
    ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
GO

C. 使用 MERGE

下面的示例指定查询中的 JOIN 操作由 MERGE 联接执行。

USE AdventureWorks2008R2;
GO
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