【发布时间】:2010-11-04 08:57:43
【问题描述】:
将条件放入 JOIN 子句与 WHERE 子句之间有什么区别(性能、最佳实践等)?
例如...
-- Condition in JOIN
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
AND CUS.FirstName = 'John'
-- Condition in WHERE
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE CUS.FirstName = 'John'
你更喜欢哪个(也许是为什么)?
【问题讨论】:
-
您是否运行了这两个查询?您是否检查了两个查询生成的执行计划?你观察到了什么?
-
@S.Lott,此查询仅用于示例目的。我只是想知道“一般”这是首选方法 - 如果有的话。
-
@Steve Dignan:您应该使用示例数据对此进行基准测试并查看查询计划。答案会非常非常清楚。而且 - 奖励 - 当出现更复杂的情况时,您将拥有一段可以重用的代码。
-
如果条件描述了关系,我会亲自将条件放在 JOIN 子句中。仅过滤结果集的通用条件将转到 WHERE 部分。例如。
FROM Orders JOIN OrderParties ON Orders.Id = OrderParties.Order AND OrderParties.Type = 'Recipient' WHERE Orders.Status = 'Canceled' -
问题和解决方案专门针对 INNER JOIN。如果连接是 LEFT/RIGHT/FULL OUTER JOIN,那么这不是偏好或性能问题,而是正确结果之一。 SQL Cookbook(第 11.3. 使用外部联接时合并 OR 逻辑)演示了联接和 where 条件之间的区别。
标签: sql performance