在某些情况下,使用JOIN或IN将为我提供正确的结果...哪一种通常具有更好的性能,为什么?它在多大程度上取决于您正在运行的数据库服务器?(仅供参考,我正在使用MSSQL)
在某些情况下,使用JOIN或IN将为我提供正确的结果...哪一种通常具有更好的性能,为什么?它在多大程度上取决于您正在运行的数据库服务器?(仅供参考,我正在使用MSSQL)
Answers:
一般来说,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
比JOIN
on 快DISTINCT
。
有关性能的详细信息,请参见我的博客中的这篇文章:
IN
暗含DISTINCT
。SQL Server
非常聪明,可以注意到它,并且将为两个查询生成相同的计划。不过,不确定其他RDBMS
人的行为如何。
这很难说-为了真正找出哪个更好,您需要实际分析执行时间。
作为一般经验法则,我认为如果您的外键列上有索引,并且如果仅(或主要)使用INNER JOIN条件,则JOIN会稍快一些。
但是,一旦您开始使用OUTER JOIN,或者如果您缺少外键索引,则IN可能会更快。
马克
关于逻辑差异的有趣文章:SQL Server:JOIN vs IN vs EXISTS-逻辑差异
我非常确定,假设保持关系和索引,Join的整体效果会更好(与其他操作相比,在该操作上投入更多的精力)。如果从概念上考虑它,那么它是2个查询和1个查询之间的区别。
您需要将其连接到查询分析器,然后尝试一下以查看区别。还要查看查询执行计划,并尝试最小化步骤。
这个主题很老,但仍然经常提及。就我个人的口味而言,它有点不完整,因为还有另一种方法可以使用EXISTS关键字查询数据库,我发现它经常更快。
因此,如果您仅对表a中的值感兴趣,则可以使用以下查询:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
如果不对col进行索引,则差异可能会很大,因为db不必查找b中具有col相同值的所有记录,而只需查找第一个记录。如果b.col上没有索引,则可能会导致ba表扫描中有很多记录。对于IN或JOIN,这将是全表扫描,对于EXISTS,这将仅是部分表扫描(直到找到第一个匹配记录)。
如果b中有很多记录具有相同的col值,那么您也会浪费大量内存将所有这些记录读入临时空间,只是为了发现您的条件得到满足。存在的情况通常可以避免。
即使有索引,我也经常发现EXISTS快于IN。它取决于数据库系统(优化器),数据,最后取决于所使用的索引类型。