SQL查询JOIN性能

3
我想知道在性能方面哪种方法更好:将条件放在JOIN中(x JOIN y on x.hi = y.hi AND ....),还是将其放在WHERE下,仅将JOIN与交叉条件配合使用。
谢谢大家。

1
关于“内连接”和“where子句”的区别,已经有大约100个问题在Stack Overflow上被提出。 - Quassnoi
4个回答

2

这将取决于查询优化引擎以及它如何将查询分解为其逻辑查询运算符。

使用MS SQL Server,您可以查看执行计划,但通常没有区别,因为优化器会将两种方式视为等效。


1

在StackOverflow上有一个类似的问题这里

这主要取决于你喜欢哪种语法。我理解的是,SQL优化器应该能够在性能上几乎没有区别的情况下评估它们。


对于某些数据库来说,这确实会产生性能差异。不幸的是,他没有说明他在使用什么数据库。 - Craig Stuntz
你们两个都有好的观点...我的答案来自于对Oracle和SQL Server的实际经验。 - Bernard Dy

0

我认为这两种方法都不会对性能产生影响(大多数数据库可以优化这种情况),但如果你使用左连接,它们可能会对结果产生影响。

SELECT  a.field1
        , a.field2
        , b.field3
FROM  table1 a
LEFT JOIN table2 b
    ON a.id = b.id
WHERE    a.field5 = 'test'
        AND b.field3 = 1

SELECT  a.field1
        , a.field2
        , b.field3
FROM table1 a
LEFT JOIN table2 b
    ON a.id = b.id AND b.field3 = 1
WHERE a.field5 = 'test'

这两个查询与第一个查询返回的结果不同,将条件放在where子句中而不是join中会将左连接转换为内连接。

如果结果相同,哪一个更快? - Himberjack

0

在 SQL Server 2008 R2 中,您不能在 WHERE 子句中使用 *==* 外连接语法。

我不希望看到一个混合了这两种风格的查询。


你甚至不应该在 SQL Server 2000 中使用它们,因为有时会被误解为交叉连接。 - HLGEM
@HLGEM:我们当然知道,但现在我们有一个很好的理由来证明为什么我们说“不”。 - gbn
1
不正确的结果难道不足以作为辩解吗?当然可以。 - HLGEM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接