SQL JOIN与IN性能?
我有一个情况,使用JOIN或IN会给我正确的结果…通常有更好的性能,为什么? 多less取决于你正在运行的数据库服务器? (FYI我正在使用MSSQL)
一般来说, 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
如果join列是UNIQUE
并标记为这样,这两个查询在SQL Server
产生相同的计划。
如果不是,则IN
比DISTINCT
JOIN
快。
在我的博客中看到这篇文章的性能细节:
-
IN
与JOIN
与EXISTS
有趣的是,你提到了这个问题,我做了一个博客文章。
请参阅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速度更快。 不过,所有的系统都是不同的,所以你应该在你的系统上确定代码。