条件在何处和条件之间是否存在差异

时间:2014-02-12 17:28:03

标签: sql optimization

下面两个陈述之间有区别吗? - 逻辑上 - 性能(可能取决于真实系统(MySQL,Oracle,...)

select * from t1 
join t2 on (t1.id=t2.id) and t1.id > 2 
join t3 on (t2.id=t3.id) and t2.id > 4;

select * from t1 
join t2 on (t1.id=t2.id) 
join t3 on (t2.id=t3.id) 
where t1.id > 2 and t2.id > 4;

1 个答案:

答案 0 :(得分:0)

我使用订单在数百万条记录中运行此操作,但具有相同的前提:

过滤加入

select *
from dbo.Orders orders
    INNER JOIN dbo.OrderItems orderItems ON orderItems.OrderID = orders.OrderID AND
        orders.OrderDate  > '01/01/2012'

过滤

select *
from dbo.Orders orders
    INNER JOIN dbo.OrderItems orderItems ON orderItems.OrderID = orders.OrderID
where
    orders.OrderDate > '01/01/2012'

<强>结论

执行计划完全相同。

<强>观察

两点:首先,这可能不会在所有情况下产生相同的执行计划。因此,正如其他人所提到的那样,你应该根据具体情况进行尝试。其次,我会使用“where”版本区分“加入”和“过滤”。一个操作是关于如何规范化数据的工件。 “过滤”组件是希望查看该数据的子集。所以我会在'where'子句中保留过滤连接数据集的内容。