我有一个使用JOIN或IN的情况会给我正确的结果…哪个通常性能更好,为什么?它在多大程度上取决于您正在运行的数据库服务器?(供参考,我使用MSSQL)
当前回答
一个有趣的关于逻辑差异的文章:SQL Server: JOIN vs IN vs EXISTS -逻辑差异
我非常确定,假设维护了关系和索引,那么Join总体上会执行得更好(在该操作上花费的精力比其他操作要多)。如果你从概念上考虑它,那么它就是2个查询和1个查询之间的区别。
您需要将其连接到Query Analyzer并进行尝试,看看有什么不同。还要查看查询执行计划并尽量减少步骤。
其他回答
这个帖子很老了,但仍然经常被提及。就我个人而言,这有点不完整,因为还有另一种使用EXISTS关键字询问数据库的方法,我发现这种方法通常更快。
所以如果你只对表a中的值感兴趣,你可以使用这个查询:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
如果col没有索引,差异可能会很大,因为db不需要找到b中col值相同的所有记录,它只需要找到第一个记录。如果b.col上没有索引,而b中有大量记录,则可能会导致表扫描。对于IN或JOIN,这将是一个完整的表扫描,对于EXISTS,这将只是一个部分表扫描(直到找到第一个匹配的记录)。
如果在b中有很多具有相同col值的记录,你也会浪费大量的内存来将所有这些记录读入一个临时空间,只是为了发现你的条件得到满足。如果存在,这通常是可以避免的。
我经常发现EXISTS比IN快,即使有索引。它取决于数据库系统(优化器)、数据以及所使用的索引类型。
一个有趣的关于逻辑差异的文章:SQL Server: JOIN vs IN vs EXISTS -逻辑差异
我非常确定,假设维护了关系和索引,那么Join总体上会执行得更好(在该操作上花费的精力比其他操作要多)。如果你从概念上考虑它,那么它就是2个查询和1个查询之间的区别。
您需要将其连接到Query Analyzer并进行尝试,看看有什么不同。还要查看查询执行计划并尽量减少步骤。
一般来说,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在DISTINCT上比JOIN快。
有关性能细节,请参阅我博客中的这篇文章:
IN、JOIN、EXISTS
每个数据库的实现,但您可能会猜到它们都以或多或少相同的方式解决共同的问题。如果您正在使用MSSQL,请查看生成的执行计划。您可以通过打开分析器并执行计划来实现这一点。这将在运行命令时为您提供文本版本。
我不确定你使用的是什么版本的MSSQL,但你可以在查询分析器的SQL Server 2000中得到一个图形化的。我确信这个功能潜伏在SQL Server Studio Manager的后续版本中。
看一下执行计划。尽可能避免表扫描,除非您的表很小,在这种情况下,表扫描比使用索引更快。阅读每个不同场景产生的不同连接操作。
优化器应该足够聪明,可以为普通查询提供相同的结果。检查一下执行计划,他们应该给你同样的东西。如果没有,我通常会认为JOIN更快。但是,所有的系统都是不同的,因此应该在系统上分析代码以确保安全。
推荐文章
- 如何在SQL中选择表的最后一条记录?
- SQL在Oracle中连接多行列值的查询
- 修改列,添加默认约束
- 在单个查询中计算空值和非空值
- 在存储过程中使用“SET XACT_ABORT ON”有什么好处?
- SQL to LINQ工具
- 如何从一个查询插入多行使用雄辩/流利
- 如何连接列在Postgres选择?
- 有人可以对SQL查询进行版权保护吗?
- 如何知道MySQL表最近一次更新?
- 如何转储一些SQLite3表的数据?
- 如何检查SQL Server文本列是否为空?
- 如何创建一个SQL Server函数“连接”多行从一个子查询到一个单独的分隔字段?
- 在MySQL中的一个查询中更新多个具有不同值的行
- 在SQL中更新多个列