联接提示 (Transact-SQL)
适用于:SQL Server
Azure SQL 数据库 Azure SQL 托管实例
联接提示用于指定查询优化器在 SQL Server 的两个表之间强制执行联接策略。 有关联接和联接语法的常规信息,请参阅 FROM 子句和 JOIN、APPLY、PIVOT。
注意
由于 SQL Server 查询优化器通常会为查询选择最佳执行计划,因此我们建议仅在最后迫不得已的情况下才可由资深的开发人员和数据库管理员使用提示。
适用于
语法
<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
则不需要。
REMOTE
在使用子句将联接谓词中要比较的值之一转换为其他排序规则时,不能使用 COLLATE
。
REMOTE
只能用于 INNER JOIN
操作。
注解
联接提示在查询的子句中 FROM
指定。 联接提示可以在两个表之间强制执行联接策略。 如果为任意两个表指定了联接提示,则查询优化器将根据关键字的位置自动强制实施查询中所有联接表的 ON
联接顺序。 在没有子句的情况下ON
使用 a CROSS JOIN
时,括号可用于指示联接顺序。
示例
本文中的 Transact-SQL 代码示例使用 AdventureWorks2022
或 AdventureWorksDW2022
示例数据库,可从 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. Use 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