使用JOIN而不是WHERE进行过滤

时间:2009-12-15 13:08:49

标签: sql

在SQL(MSSQL,Oracle等等)中,在连接表时,将过滤器添加到JOIN语句而不是在WHERE子句中有什么好处?

SELECT * FROM X INNER JOIN Y ON X.A = Y.A WHERE X.B = 'SOMETHING'

SELECT * FROM X INNER JOIN Y ON X.A = Y.A AND X.B = 'SOMETHING'

我意识到这并不适用于所有情况,但我注意到在某些情况下,通过将过滤条件放在JOIN语句中似乎可以获得性能提升。但是,因为它是JOIN语句的一部分,所以它也会使它表现得有些奇怪。

思想?

6 个答案:

答案 0 :(得分:5)

我有时在具有大量连接的查询中执行此操作,因为它在查询的一部分中将所有关于连接的信息本地化,而不是在连接条件中有一些,而在where子句中有一些。

答案 1 :(得分:5)

对于INNER JOIN查询,这些过滤器的性能特征将取决于许多因素 - 表的大小,索引,查询的选择性以及特定于执行查询的RDBMS的其他因素

LEFTRIGHT OUTER JOIN中,过滤器的位置比INNER JOIN更重要,因为会影响它是否会在(JOIN子句)之前或之后应用( WHERE子句)进行连接。

答案 2 :(得分:3)

对于INNER JOIN,我不希望性能差异,而是使用相同的计划,无论过滤器是在JOIN ... ON子句还是WHERE子句中。我个人更喜欢使用JOIN子句中的连接条件和WHERE子句中的过滤 - 一种将所有“参数”粘贴到同一位置的SQL语句的方法 - 这不一定是明智的或者不是 - 深思熟虑。相反,有些人喜欢在JOIN子句中使用所有内容来保持所有内容。

外部联接的情况不同 - “a.a_id = b.a_id和b.type = 1的左外部联接b”和“a.a_id上的左外部联接b”之间存在显着差异b.a_id WHERE b.type = 1“ - 实际上后者隐式强制内连接。这是将所有这些条件置于JOIN子句中的另一个原因,以保持一致性。

答案 3 :(得分:2)

这些语法是同义词,并且大多数RDBMS都针对相同的事情进行了优化。

我通常更喜欢这种语法:

SELECT  *
FROM    X
INNER JOIN
        Y
ON      X.A = Y.A
WHERE   X.B = 'SOMETHING'

B不属于AB之间的逻辑链接的一部分时,这一个:

SELECT  *
FROM    X
INNER JOIN
        Y
ON      X.A = Y.A
        AND X.B = 'SOMETHING'

当它。

答案 4 :(得分:0)

除了清晰度和含义之外什么都没有。除非你有外连接。

答案 5 :(得分:0)

作为一个人(而不是优化器),在维护查询时,我会在JOIN子句中查找连接条件,在WHERE子句中查找搜索条件。

当然,您需要在性能问题和代码维护问题之间取得平衡。但是,我的首要任务是在第一个实例中使用良好的逻辑代码,然后根据需要进行优化。

相关问题