在SQL(MSSQL,Oracle等)中,在联接表时,向JOIN语句添加过滤器而不是在WHERE子句中添加过滤器有什么好处?
IE
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语句的一部分,因此也会使它的行为有些奇怪。
有什么想法吗?
对于INNER JOIN查询,这些过滤器的性能特征将取决于许多因素-表的大小,索引,查询的选择性以及特定于在其上执行查询的RDBMS的其他因素。
INNER JOIN
在LEFT和中RIGHT OUTER JOIN,过滤器的位置比至关重要INNER JOIN,因为它影响在执行连接之前(JOIN子句)还是之后(WHERE子句)应用它。
LEFT
RIGHT OUTER JOIN
JOIN
WHERE