在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'

你更喜欢哪一个(也许为什么)?


当前回答

我更喜欢使用JOIN来连接完整的表/视图,然后使用WHERE来引入结果集的谓词。

它在语法上感觉更简洁。

其他回答

WHERE将在JOIN发生后进行筛选。

在JOIN上的过滤器,以防止在JOIN过程中添加行。

对我来说,在join中放置条件似乎是“语义上错误的”,因为这不是join的“目的”。但这是非常定性的。

另外一个问题:如果您决定从内部连接切换到(比如说)右连接,将条件设置在join内部可能会导致意想不到的结果。

大多数RDBMS产品将以相同的方式优化这两个查询。在Peter Gulutzan和Trudy Pelzer的“SQL性能调优”中,他们测试了多个RDBMS品牌,并没有发现性能差异。

我倾向于将连接条件与查询限制条件分开。

如果使用OUTER JOIN,有时有必要在JOIN子句中放入条件。

我更喜欢使用JOIN来连接完整的表/视图,然后使用WHERE来引入结果集的谓词。

它在语法上感觉更简洁。

在筛选连接时,我通常看到性能有所提高。特别是如果可以联接两个表的索引列。大多数查询都这样做,您应该能够减少逻辑读取,在大容量环境中,这是一个比执行时间更好的性能指标。

当有人展示他们的SQL基准测试时,他们在午夜在开发服务器上执行了一个sproc的两个版本5万次,并比较了平均时间,我总是觉得有点好笑。