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


当前回答

这个帖子很老了,但仍然经常被提及。就我个人而言,这有点不完整,因为还有另一种使用EXISTS关键字询问数据库的方法,我发现这种方法通常更快。

所以如果你只对表a中的值感兴趣,你可以使用这个查询:

SELECT  a.*
FROM    a
WHERE   EXISTS (
    SELECT  *
    FROM    b
    WHERE   b.col = a.col
    )

如果col没有索引,差异可能会很大,因为db不需要找到b中col值相同的所有记录,它只需要找到第一个记录。如果b.col上没有索引,而b中有大量记录,则可能会导致表扫描。对于IN或JOIN,这将是一个完整的表扫描,对于EXISTS,这将只是一个部分表扫描(直到找到第一个匹配的记录)。

如果在b中有很多具有相同col值的记录,你也会浪费大量的内存来将所有这些记录读入一个临时空间,只是为了发现你的条件得到满足。如果存在,这通常是可以避免的。

我经常发现EXISTS比IN快,即使有索引。它取决于数据库系统(优化器)、数据以及所使用的索引类型。

其他回答

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

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

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

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

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

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

Marc

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

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

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

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

这个帖子很老了,但仍然经常被提及。就我个人而言,这有点不完整,因为还有另一种使用EXISTS关键字询问数据库的方法,我发现这种方法通常更快。

所以如果你只对表a中的值感兴趣,你可以使用这个查询:

SELECT  a.*
FROM    a
WHERE   EXISTS (
    SELECT  *
    FROM    b
    WHERE   b.col = a.col
    )

如果col没有索引,差异可能会很大,因为db不需要找到b中col值相同的所有记录,它只需要找到第一个记录。如果b.col上没有索引,而b中有大量记录,则可能会导致表扫描。对于IN或JOIN,这将是一个完整的表扫描,对于EXISTS,这将只是一个部分表扫描(直到找到第一个匹配的记录)。

如果在b中有很多具有相同col值的记录,你也会浪费大量的内存来将所有这些记录读入一个临时空间,只是为了发现你的条件得到满足。如果存在,这通常是可以避免的。

我经常发现EXISTS比IN快,即使有索引。它取决于数据库系统(优化器)、数据以及所使用的索引类型。