我有一个情况,在这种情况下使用JOIN或IN将给我正确的结果... 通常哪个具有更好的性能,为什么?在多大程度上取决于您使用哪个数据库服务器?(FYI我正在使用MSSQL)
我有一个案例,在这个案例中使用JOIN或IN都可以给我正确的结果。通常哪个性能更好,为什么?这在多大程度上取决于您使用的数据库服务器?(FYI我正在使用MSSQL)我有一个情况,在这种情况下使用JOIN或IN将给我正确的结果... 通常哪个具有更好的性能,为什么?在多大程度上取决于您使用哪个数据库服务器?(FYI我正在使用MSSQL)
我有一个案例,在这个案例中使用JOIN或IN都可以给我正确的结果。通常哪个性能更好,为什么?这在多大程度上取决于您使用的数据库服务器?(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
如果连接列是UNIQUE
并标记为这样,在SQL Server
中这两个查询将产生相同的计划。如果不是,那么在具有DISTINCT
的情况下,IN
比JOIN
更快。请参阅我博客上的文章以获取性能详细信息:这个帖子已经很旧了,但仍经常被提及。就我个人的口味而言,它有点不完整,因为还有另一种使用 EXISTS 关键字查询数据库的方法,我发现它通常比较快。
因此,如果您只对表 a 中的值感兴趣,可以使用以下查询:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
如果col没有被索引,差异可能会很大,因为数据库不必在b中找到所有具有相同col值的记录,它只需找到第一条记录。如果在b.col上没有索引且b中有很多记录,则可能导致表扫描。使用IN或JOIN将导致完全表扫描,而使用EXISTS将只是部分表扫描(直到找到第一个匹配记录)。
如果b中有许多具有相同col值的记录,则您还会浪费大量内存将所有这些记录读入临时空间,仅仅是为了发现条件已满足。使用exists通常可以避免这种情况。
我经常发现即使有索引,EXISTS也比IN更快。这取决于数据库系统(优化程序)、数据以及最后但并非最不重要的使用的索引类型。
这个很难说 - 为了真正找出哪种方法更好,你需要实际测试执行时间。
一般而言,如果你在外键列上有索引,并且只使用(或大多数使用)INNER JOIN条件,那么JOIN会稍微快一些。
但是一旦你开始使用OUTER JOIN,或者缺少外键索引,IN可能会更快。
Marc
优化器应该足够智能,以便在正常查询中以任何一种方式都给出相同的结果。检查执行计划,它们应该给出相同的结果。如果不是这样,我通常认为JOIN更快。然而,所有系统都是不同的,因此您应该在您的系统上对代码进行分析以确保。