Ste*_*nan 170 sql performance
将条件放入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'
Run Code Online (Sandbox Code Playgroud)
您更喜欢哪个(也许是为什么)?
Cad*_*oux 144
关系代数允许WHERE子句中的谓词的可互换性INNER JOIN,因此即使INNER JOIN带有WHERE子句的查询也可以让优化器重新排列谓词,以便在过程中可以排除它们JOIN.
我建议您以最可读的方式编写查询.
有时这包括使INNER JOIN相对"不完整",并WHERE简单地将一些标准放在一起,以使过滤标准列表更容易维护.
例如,而不是:
SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
ON ca.CustomerID = c.CustomerID
AND c.State = 'NY'
INNER JOIN Accounts a
ON ca.AccountID = a.AccountID
AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)
写:
SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)
但这当然取决于它.
HLG*_*GEM 115
对于内连接,我没有真正注意到差异(但与所有性能调整一样,您需要根据您的条件检查数据库).
但是,如果使用左连接或右连接,则放置条件会产生巨大差异.例如,考虑这两个查询:
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderDate >'20090515'
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
AND ORD.OrderDate >'20090515'
Run Code Online (Sandbox Code Playgroud)
第一个将只给出那些订单日期晚于2009年5月15日的记录,从而将左连接转换为内连接.第二个是给那些记录加上没有订单的任何客户.根据您放置条件的位置,结果集非常不同.(选择*仅作为示例,当然不应在生产代码中使用.)例外情况是,您只想查看一个表中的记录而不能查看另一个表中的记录.然后使用where子句作为条件而不是连接.
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderID is null
Run Code Online (Sandbox Code Playgroud)
Bil*_*win 24
大多数RDBMS产品都会以相同的方式优化两个查询.在Peter Gulutzan和Trudy Pelzer的"SQL Performance Tuning"中,他们测试了多个品牌的RDBMS并发现没有性能差异.
我更喜欢将连接条件与查询限制条件分开.
如果您OUTER JOIN有时使用,则需要在join子句中添加条件.
The*_*TXI 10
在JOIN发生后将过滤WHERE.
过滤JOIN以防止在JOIN过程中添加行.
| 归档时间: |
|
| 查看次数: |
201739 次 |
| 最近记录: |