联接提示 (Transact-SQL)

联接提示用于指定查询优化器在 SQL Server 2014 的两个表之间强制执行联接策略。 有关联接和联接语法的一般信息,请参阅 FROM (Transact-SQL)

重要说明重要提示

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

适用于:

DELETE

SELECT

UPDATE

适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。

主题链接图标 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 联接执行。 该示例使用 AdventureWorks2012 数据库。

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 联接执行。 该示例使用 AdventureWorks2012 数据库。

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 联接执行。 该示例使用 AdventureWorks2012 数据库。

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

请参阅

参考

提示 (Transact-SQL)