带有过滤条件的SQL Join查询:性能

时间:2015-02-24 08:05:25

标签: sql oracle11g

我想加入几个表但是从'A'表中过滤掉一个特定的类型。哪个是来自以下两个查询的更好的查询(是否有更好的方法?)或查询优化器没有区别?

在'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 个答案:

答案 0 :(得分:1)

使用INNER JOIN并没有产生性能差异,您可以使用EXPLAIN进行检查(两种形式的查询都应该产生相同的计划)。

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

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

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