在SQL (MSSQL、Oracle等)中,当连接表时,将筛选器添加到连接语句中而不是将其放在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语句的一部分,它也可能导致它的行为有点奇怪。
有什么想法?
发布于 2009-12-15 21:18:22
对于INNER JOIN查询,这些过滤器的性能特征将取决于许多因素-表的大小、索引、查询的选择性以及执行查询的RDBMS特有的其他因素。
在LEFT和RIGHT OUTER JOIN中,过滤器的位置比INNER JOIN重要得多,因为它影响是在执行连接之前(JOIN子句)还是之后(WHERE子句)应用它。
发布于 2009-12-15 21:11:43
我有时在有很多连接的查询中这样做,因为它将有关连接的所有信息本地化在查询的一部分,而不是在连接条件中有一些信息,在where子句中有一些信息。
发布于 2009-12-15 21:19:17
对于内部连接,我不期望性能差异,而是无论过滤器是在JOIN...ON子句中还是在WHERE子句中,都将使用相同的计划。我个人更喜欢在join子句中编写连接条件,在WHERE子句中使用过滤-一种将所有“参数”粘贴到SQL语句中的方法-这不一定是明智的或经过深思熟虑的。相反,有些人喜欢将所有内容都放在JOIN子句中,以将所有内容放在一起。
外部连接的情况是不同的- "a LEFT ON join b ON a.a_id=b.a_id and b.type = 1“和"a LEFT ON JOIN b ON a.a_id=b.a_id WHERE b.type=1"-事实上,后者隐式地强制执行内部连接。这将是将所有这些条件放在JOIN子句中以保持一致性的另一个原因。
https://stackoverflow.com/questions/1907335
复制相似问题