我有一个使用JOIN或IN的情况会给我正确的结果…哪个通常性能更好,为什么?它在多大程度上取决于您正在运行的数据库服务器?(供参考,我使用MSSQL)


当前回答

这很难说——为了真正找出哪个工作得更好,您需要实际分析执行时间。

作为一般的经验法则,我认为如果外键列上有索引,并且只使用(或主要使用)INNER JOIN条件,那么JOIN会稍微快一些。

但是一旦开始使用OUTER JOIN,或者如果缺少外键索引,IN可能会更快。

Marc

其他回答

这很难说——为了真正找出哪个工作得更好,您需要实际分析执行时间。

作为一般的经验法则,我认为如果外键列上有索引,并且只使用(或主要使用)INNER JOIN条件,那么JOIN会稍微快一些。

但是一旦开始使用OUTER JOIN,或者如果缺少外键索引,IN可能会更快。

Marc

优化器应该足够聪明,可以为普通查询提供相同的结果。检查一下执行计划,他们应该给你同样的东西。如果没有,我通常会认为JOIN更快。但是,所有的系统都是不同的,因此应该在系统上分析代码以确保安全。

每个数据库的实现,但您可能会猜到它们都以或多或少相同的方式解决共同的问题。如果您正在使用MSSQL,请查看生成的执行计划。您可以通过打开分析器并执行计划来实现这一点。这将在运行命令时为您提供文本版本。

我不确定你使用的是什么版本的MSSQL,但你可以在查询分析器的SQL Server 2000中得到一个图形化的。我确信这个功能潜伏在SQL Server Studio Manager的后续版本中。

看一下执行计划。尽可能避免表扫描,除非您的表很小,在这种情况下,表扫描比使用索引更快。阅读每个不同场景产生的不同连接操作。

一般来说,IN和JOIN是不同的查询,可以产生不同的结果。

SELECT  a.*
FROM    a
JOIN    b
ON      a.col = b.col

不一样吗

SELECT  a.*
FROM    a
WHERE   col IN
        (
        SELECT  col
        FROM    b
        )

,除非b.col是唯一的。

然而,这是第一个查询的同义词:

SELECT  a.*
FROM    a
JOIN    (
        SELECT  DISTINCT col
        FROM    b
        )
ON      b.col = a.col

如果连接列是UNIQUE并被这样标记,这两个查询在SQL Server中产生相同的计划。

如果不是,那么IN在DISTINCT上比JOIN快。

有关性能细节,请参阅我博客中的这篇文章:

IN、JOIN、EXISTS

一个有趣的关于逻辑差异的文章:SQL Server: JOIN vs IN vs EXISTS -逻辑差异

我非常确定,假设维护了关系和索引,那么Join总体上会执行得更好(在该操作上花费的精力比其他操作要多)。如果你从概念上考虑它,那么它就是2个查询和1个查询之间的区别。

您需要将其连接到Query Analyzer并进行尝试,看看有什么不同。还要查看查询执行计划并尽量减少步骤。