我有一个使用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快,即使有索引。它取决于数据库系统(优化器)、数据以及所使用的索引类型。
优化器应该足够聪明,可以为普通查询提供相同的结果。检查一下执行计划,他们应该给你同样的东西。如果没有,我通常会认为JOIN更快。但是,所有的系统都是不同的,因此应该在系统上分析代码以确保安全。
一个有趣的关于逻辑差异的文章:SQL Server: JOIN vs IN vs EXISTS -逻辑差异
我非常确定,假设维护了关系和索引,那么Join总体上会执行得更好(在该操作上花费的精力比其他操作要多)。如果你从概念上考虑它,那么它就是2个查询和1个查询之间的区别。
您需要将其连接到Query Analyzer并进行尝试,看看有什么不同。还要查看查询执行计划并尽量减少步骤。
这很难说——为了真正找出哪个工作得更好,您需要实际分析执行时间。
作为一般的经验法则,我认为如果外键列上有索引,并且只使用(或主要使用)INNER JOIN条件,那么JOIN会稍微快一些。
但是一旦开始使用OUTER JOIN,或者如果缺少外键索引,IN可能会更快。
Marc
每个数据库的实现,但您可能会猜到它们都以或多或少相同的方式解决共同的问题。如果您正在使用MSSQL,请查看生成的执行计划。您可以通过打开分析器并执行计划来实现这一点。这将在运行命令时为您提供文本版本。
我不确定你使用的是什么版本的MSSQL,但你可以在查询分析器的SQL Server 2000中得到一个图形化的。我确信这个功能潜伏在SQL Server Studio Manager的后续版本中。
看一下执行计划。尽可能避免表扫描,除非您的表很小,在这种情况下,表扫描比使用索引更快。阅读每个不同场景产生的不同连接操作。
推荐文章
- MySQL选择列不为空的位置
- SQL JOIN vs IN性能?
- SQL的地方. .IN子句多列
- 使用'='或LIKE比较SQL中的字符串?
- 修改表:如何将“允许空”属性从不空改为允许空
- 比较两个SQL Server数据库(模式和数据)的最佳工具是什么?
- 在SQL中,如何在范围中“分组”?
- 选项(RECOMPILE)总是更快;为什么?
- 设置数据库从单用户模式到多用户
- 如何找到Java堆大小和内存使用(Linux)?
- oracle中的RANK()和DENSE_RANK()函数有什么区别?
- 我如何转义一个百分比符号在T-SQL?
- SQL Server恢复错误-拒绝访问
- 如何在HTML5中改变视频的播放速度?
- 的类型不能用作索引中的键列