联接提示 (Transact-SQL)

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

联接提示用于指定查询优化器在 SQL Server 的两个表之间强制执行联接策略。 有关联接和联接语法的常规信息,请参阅 FROM 子句和 JOIN、APPLY、PIVOT

注意

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

适用于

Transact-SQL 语法约定

语法

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

注意

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

参数

{ LOOP |HASH |MERGE }

指定查询中的联接应使用循环、哈希或合并。 使用LOOPHASHMERGE JOIN强制执行两个表之间的特定联接。 LOOP 不能与 RIGHT 联接 FULL 类型或联接类型一起指定。 有关详细信息,请参阅联接

REMOTE

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

如果右表为本地表,则联接在本地执行。 如果这两个表都是远程表,但来自不同数据源, REMOTE 则会导致联接在正确的表的站点上执行。 如果这两个表都是来自同一数据源的远程表, REMOTE 则不需要。

REMOTE 在使用子句将联接谓词中要比较的值之一转换为其他排序规则时,不能使用 COLLATE

REMOTE 只能用于 INNER JOIN 操作。

注解

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

示例

本文中的 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. 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