SQL JOIN vs IN性能?

Pol*_*878 153 sql t-sql sql-server performance

我有一个案例,使用JOIN或IN将给我正确的结果......通常有更好的性能,为什么?它取决于您运行的数据库服务器多少钱?(仅供参考我使用的是MSSQL)

Qua*_*noi 185

一般来说,INJOIN不同的查询,可以产生不同的结果.

SELECT  a.*
FROM    a
JOIN    b
ON      a.col = b.col
Run Code Online (Sandbox Code Playgroud)

是不一样的

SELECT  a.*
FROM    a
WHERE   col IN
        (
        SELECT  col
        FROM    b
        )
Run Code Online (Sandbox Code Playgroud)

,除非b.col是独一无二的.

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

SELECT  a.*
FROM    a
JOIN    (
        SELECT  DISTINCT col
        FROM    b
        )
ON      b.col = a.col
Run Code Online (Sandbox Code Playgroud)

如果加入列是UNIQUE并标记为这样,则这两个查询都会生成相同的计划SQL Server.

如果不是,那么INJOIN开快DISTINCT.

有关性能详情,请参阅我的博客中的这篇文章

  • @ orlandu63:`IN`暗示`DISTINCT`."SQL Server"非常聪明,可以注意到它,并为两个查询生成相同的计划.但是,不确定其他`RDBMS`的行为方式. (8认同)

cle*_*tus 26

有趣的是你提到了,我在这个主题上写了一篇博文.

请参阅Oracle vs MySQL与SQL Server:聚合与联接

简短的回答:你必须测试它,个人数据库变化很大.


mar*_*c_s 7

这很难说 - 为了真正找出哪个更有效,您需要实际分析执行时间。

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

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

马克


小智 7

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

因此,如果您只对表 a 中的值感兴趣,则可以使用以下查询:

SELECT  a.*
FROM    a
WHERE   EXISTS (
    SELECT  *
    FROM    b
    WHERE   b.col = a.col
    )
Run Code Online (Sandbox Code Playgroud)

如果 col 没有被索引,差异可能会很大,因为 db 不必在 b 中找到所有在 col 中具有相同值的记录,它只需要找到第一个。如果 b.col 上没有索引并且 ba 表扫描中的大量记录可能是结果。使用 IN 或 JOIN 这将是全表扫描,使用 EXISTS 这将只是部分表扫描(直到找到第一个匹配记录)。

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

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

  • 在 MSSql 上,存在比 IN 更好的事实似乎不正确。有关更多信息:http://explainextended.com/2009/06/16/in-vs-join-vs-exists/ 在此处您可以阅读:“许多人认为 EXISTS 比 IN 更有效,因为 EXISTS 仅返回一行。这对于 SQL Server 而言并非如此。正如我们从上面的示例中看到的,EXISTS 和 IN 产生完全相同的计划。这是因为 EXISTS 比 IN 更灵活。IN 总是可以重写为 EXISTS(使用简单的WHERE 条件与 equijoin) 但反之亦然。” (3认同)

Ada*_*ane 5

关于逻辑差异的有趣文章:SQL Server: JOIN vs IN vs EXISTS - the Logical Difference

我非常确定,假设维护关系和索引,联接的整体性能会更好(与其他操作相比,使用该操作需要付出更多的努力)。如果您从概念上考虑,那么这就是 2 个查询和 1 个查询之间的区别。

您需要将其连接到查询分析器并尝试并查看差异。另请查看查询执行计划并尝试尽量减少步骤。