SQL JOIN与IN性能?

我有一个情况,使用JOIN或IN会给我正确的结果…通常有更好的性能,为什么? 多less取决于你正在运行的数据库服务器? (FYI我正在使用MSSQL)

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

 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 

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

如果不是,则INDISTINCT JOIN快。

在我的博客中看到这篇文章的性能细节:

  • INJOINEXISTS

有趣的是,你提到了这个问题,我做了一个博客文章。

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

简短的回答:你必须testing它,个人数据库差异很大。

这很难说 – 为了真正找出哪一个更好,你需要真正的执行时间。

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

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

渣子

每个数据库的实现,但你可以猜测,他们都或多或less地以相同的方式解决常见的问题。 如果您使用的是MSSQL,请查看生成的执行计划。 你可以通过打开分析器和执行计划来做到这一点。 当你运行命令时,这会给你一个文本版本。

我不确定你正在使用什么版本的MSSQL,但是你可以在查询分析器中的SQL Server 2000中得到一个graphics化的版本。 我相信,这个function潜伏在SQL Server Studio Manager的更高版本中。

看看计划。 尽可能避免表扫描,除非你的表很小,在这种情况下,表扫描比使用索引要快。 阅读每个不同场景产生的不同的联合操作。

关于逻辑差异的一个有趣的写法: SQL Server:JOIN vs IN vs EXISTS – 逻辑差异

我相当肯定,假设关系和索引保持一个联接将performance更好的整体(更多的努力与其他操作与该操作进行工作)。 如果你在概念上思考它,那么它是2个查询和1个查询之间的区别。

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

这个线程是相当古老,但仍然经常提到。 对于我个人来说,这有点不完整,因为还有另外一种方法可以用EXISTS关键字来询问数据库,而我发现这个关键词往往比较快。

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

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

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

如果b中有大量logging具有相同的col值,那么您也将浪费大量的内存来将所有这些logging读入临时空间,以便发现您的条件得到满足。 存在这通常可以避免。

即使有索引,我也经常发现EXIS更快。 它依赖于数据库系统(优化器),数据和最后一个使用的索引types。

优化器应该足够聪明,可以为普通查询提供相同的结果。 检查执行计划,他们应该给你同样的事情。 如果他们不这样做,我通常会认为JOIN速度更快。 不过,所有的系统都是不同的,所以你应该在你的系统上确定代码。