2015-02-24 76 views
2

我想加入几个表,但要过滤来自'A'表的特定类型。哪个更好的查询来自以下两个查询(有没有更好的方法?)还是没有查询优化器的差异原因?SQL加入具有过滤条件的查询:性能

当过滤条件被在给定的“WHERE子句:

SELECT .. FROM A a JOIN B b ON a.id=b.id JOIN C c on a.id = c.id...<other joins>...WHERE a.col='SOME_VAL'; 

过滤条件被内给出“ON”:

SELECT .. FROM A a JOIN B b ON a.id=b.id AND a.col='SOME_VAL' JOIN C c on a.id = c.id...<other joins> 

回答

1

随着内部联接没有造成的性能差异,这你可以使用EXPLAIN来检查(你的查询的两种形式都应该产生相同的计划)。

使用WHERE子句的好处通常是可读性。与多行布局结合使用时。 (我强烈建议不要保留你所有的SQL作为一个长行。)

SELECT 
    stuff 
FROM 
    foo 
INNER JOIN 
    bar 
    ON (join predicates here) 
WHERE 
    (static filters here) 

变得更容易阅读的原因(和维护)是连接谓词现在明确只描述表之间的关系。该查询仍然正确运行没有WHERE子句,但返回一个更大的集合。