联接提示 (Transact-SQL)
联接提示用于指定查询优化器在两个表之间强制执行联接策略。
重要提示 |
---|
由于 SQL Server 查询优化器通常为查询选择最佳执行计划,所以,建议只将提示(包括 <join_hint>)用作经验丰富的开发人员和数据库管理员的最终手段。 |
适用范围:
语法
<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