我有一个使用JOIN或IN的情况会给我正确的结果…哪个通常性能更好,为什么?它在多大程度上取决于您正在运行的数据库服务器?(供参考,我使用MSSQL)
这很难说——为了真正找出哪个工作得更好,您需要实际分析执行时间。
作为一般的经验法则,我认为如果外键列上有索引,并且只使用(或主要使用)INNER JOIN条件,那么JOIN会稍微快一些。
但是一旦开始使用OUTER JOIN,或者如果缺少外键索引,IN可能会更快。
Marc
优化器应该足够聪明,可以为普通查询提供相同的结果。检查一下执行计划,他们应该给你同样的东西。如果没有,我通常会认为JOIN更快。但是,所有的系统都是不同的,因此应该在系统上分析代码以确保安全。
每个数据库的实现,但您可能会猜到它们都以或多或少相同的方式解决共同的问题。如果您正在使用MSSQL,请查看生成的执行计划。您可以通过打开分析器并执行计划来实现这一点。这将在运行命令时为您提供文本版本。
我不确定你使用的是什么版本的MSSQL,但你可以在查询分析器的SQL Server 2000中得到一个图形化的。我确信这个功能潜伏在SQL Server Studio Manager的后续版本中。
看一下执行计划。尽可能避免表扫描,除非您的表很小,在这种情况下,表扫描比使用索引更快。阅读每个不同场景产生的不同连接操作。
一般来说,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
一个有趣的关于逻辑差异的文章: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快,即使有索引。它取决于数据库系统(优化器)、数据以及所使用的索引类型。
推荐文章
- GROUP BY with MAX(DATE)
- 删除id与其他表不匹配的sql行
- 加快R中的循环操作
- 等价的限制和偏移SQL Server?
- 如何从SQL Server中的字符串中剥离所有非字母字符?
- INT和VARCHAR主键之间有真正的性能差异吗?
- 为什么我不能在DELETE语句中使用别名?
- 在SQL Server Management Studio中保存带有标题的结果
- "where 1=1"语句
- c++标准是否要求iostreams的性能很差,或者我只是在处理一个糟糕的实现?
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- 多语句表值函数vs内联表值函数
- 如何从Oracle的表中获取列名?
- NOLOCK提示在SELECT语句中的作用
- SQL OVER()子句-它什么时候有用,为什么有用?