SQL Server IN与EXISTS性能
我很好奇以下哪一项会更有效率?
对于使用IN
,我一直比较谨慎,因为我相信SQL Server会将结果集变成一个大的IF
语句。 对于较大的结果集,这可能导致性能较差。 对于小的结果集,我不确定是否可取。 对于大的结果集,不会EXISTS
更有效率吗?
WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)
与
WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2])
EXISTS
会更快,因为一旦引擎发现一击,就会停止看,因为条件已经certificate是正确的。
使用IN
,它将在进一步处理之前收集来自子查询的所有结果。
我已经在SQL Server 2005和2008上做了一些testing,EXISTS和IN两者都回来了完全相同的实际执行计划,正如其他人所说的那样。 优化器是最佳的。 🙂
需要注意的是,EXISTS,IN和JOIN有时可能会返回不同的结果,如果您没有将您的查询短语恰到好处: http : //weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210的.aspx
接受的答案是短视的,这个问题有点松散:
1)既没有明确提及覆盖指数是在左边还是右边还是两边都存在。
2)不考虑input左侧设置和input右侧设置的大小。
(这个问题刚刚提到了一个大的结果集)。
我认为当(1)和(2)存在显着的成本差异时,优化器足够聪明,可以在“in”和“exists”之间进行转换,否则可能只是用作提示(例如鼓励使用一个可寻求的索引在右侧)。
这两种forms都可以在内部转换为连接forms,使连接顺序反转,并根据估计的行数(左和右)以及左侧,右侧或双侧中的索引存在性运行循环,散列或合并。
我会用EXISTS去IN,看下面的链接:
SQL Server:JOIN vs IN vs EXISTS – 逻辑差异
在这些情况下,执行计划通常是相同的,但是直到你看到优化器如何影响所有其他方面的指标等,你真的永远不会知道。
为了优化EXISTS
,是非常直接的; 有些东西只是在那里,但实际上并不需要从相关的子查询中返回的任何数据。 你只是评估一个布尔条件。
所以:
WHERE EXISTS (SELECT TOP 1 1 FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)
因为相关的子查询是RBAR
,所以第一个结果命中使得条件成立,并且不再处理。
在我的头顶,并不保证是正确的:我相信在这种情况下,第二个会更快。
- 首先,相关的子查询可能会导致子查询为每一行运行。
- 在第二个例子中,子查询应该只运行一次,因为不相关。
- 在第二个例子中,
IN
一旦发现匹配就会短路。