Pol*_*878 153 sql t-sql sql-server performance
我有一个案例,使用JOIN或IN将给我正确的结果......通常有更好的性能,为什么?它取决于您运行的数据库服务器多少钱?(仅供参考我使用的是MSSQL)
Qua*_*noi 185
一般来说,IN和JOIN不同的查询,可以产生不同的结果.
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.
如果不是,那么IN比JOIN开快DISTINCT.
有关性能详情,请参阅我的博客中的这篇文章
这很难说 - 为了真正找出哪个更有效,您需要实际分析执行时间。
作为一般经验法则,我认为如果您的外键列上有索引,并且您只(或大部分)使用 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 更快。它取决于数据库系统(优化器)、数据,最后还取决于所使用的索引类型。
关于逻辑差异的有趣文章:SQL Server: JOIN vs IN vs EXISTS - the Logical Difference
我非常确定,假设维护关系和索引,联接的整体性能会更好(与其他操作相比,使用该操作需要付出更多的努力)。如果您从概念上考虑,那么这就是 2 个查询和 1 个查询之间的区别。
您需要将其连接到查询分析器并尝试并查看差异。另请查看查询执行计划并尝试尽量减少步骤。