提示 (Transact-SQL) - 联接

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

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

注意

由于 SQL Server 查询优化器通常会为查询选择最佳执行计划,因此我们建议仅在最后迫不得已的情况下才可由资深的开发人员和数据库管理员使用提示。

适用于

Transact-SQL 语法约定

语法

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

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

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

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

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

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)