我想知道在JOIN
条款中ON ()
的条件是否更适合维护,而不是后者WHERE
。
示例:
Select * from persons p
INNER JOIN x on (x.id = p.id AND x.other = p.other)
Select * from persons p
INNER JOIN x on (x.id = p.id)
WHERE x.other = p.other
这看起来不错,但是考虑到多个JOIN,我认为它更难:
Select * from persons p
INNER JOIN x on (x.id = p.id)
INNER JOIN x2 on (x2.id = p.id)
INNER JOIN x3 on (x3.id = p.id)
WHERE x.other = p.other AND x2.other = p.other2 AND x3.other = p.other3
Select * from persons p
INNER JOIN x on (x.id = p.id AND x.other = p.other)
INNER JOIN x2 on (x2.id = p.id AND x2.other = p.other2)
INNER JOIN x3 on (x3.id = p.id AND x3.other = p.other3)
我正在测试我正在开发的应用程序并切换条件产生相同的执行计划,以为我不知道我是否遗漏了某些东西,或者我是否能在某些情况下发现性能影响。< / p>
由于
编辑:与被标记为重复的问题不同。我不要问JOIN和WHERE之间的区别。在使用JOIN语句时,我要求在WHERE中放置条件的区别,而不是在ON子句中。
正如我在上一个问题的评论中所说,第二个JOIN处理已经过滤的数据的速度不应该比WHERE以后处理所有数据的速度快吗?
答案 0 :(得分:0)
将连接上的条件与将它们放入where子句之间的区别在于每个查询中的数据形状。
假设您的人员表中有1000行,x中有800行,x2中有600行,x3中有500行符合您指定的persons.id JOIN条件。
在此查询中:
Select * from persons p
INNER JOIN x on (x.id = p.id)
INNER JOIN x2 on (x2.id = p.id)
INNER JOIN x3 on (x3.id = p.id)
WHERE x.other = p.other AND x2.other = p.other2 AND x3.other = p.other3
到达WHERE子句时,您将根据指定的条件评估500行。
而在此查询中:
Select * from persons p
INNER JOIN x on (x.id = p.id AND x.other = p.other)
INNER JOIN x2 on (x2.id = p.id AND x2.other = p2.other)
INNER JOIN x3 on (x3.id = p.id AND x3.other = p3.other)
在最糟糕的情况下,您可能仍会最终评估500行(所有x.other = p.other条件评估为TRUE),但最有可能的是,当您到达最后一个时,您将最终评估较少的行数加入。