使用IN,EXISTS和ANY / SOME

时间:2013-07-09 18:51:59

标签: sql tsql exists any

我正在尝试优化一些存储过程,并且他们经常使用EXISTS,ANY或IN,我想知道哪种特定情况的区别最好是IN,Exists或ANY。

我使用IN,EXISTS和ANY创建了三个查询并检查了它们的执行周期,但是所有三个查询的执行周期都是相同的。我很困惑为什么它会变得相同,执行周期如何不同或者它可能有什么不同的情况。下面是我尝试过的三个查询和执行周期。任何人都可以举例说明如何更改执行周期,请分享任何场景或查询。

使用EXISTS

查询

子查询中还有一个问题,*或指定列的需要是什么?

SELECT * FROM RecastEvents AS re
    WHERE EXISTS (Select * FROM Metadata 
                      WHERE EventId = 2145984 AND EventId = re.CCId)

Execution Cycle of Exists

使用IN

查询
SELECT * FROM RecastEvents as re
    WHERE re.CCID IN (SELECT EventId FROM Metadata
                          WHERE EventId = 2145984)

Execution Cycle of IN

使用ANY

查询
SELECT * FROM RecastEvents AS re
    WHERE re.CCID = ANY (SELECT EventId FROM Metadata 
                             WHERE EventId = 2145984)

enter image description here

2 个答案:

答案 0 :(得分:3)

它的结果是相同的,因为查询优化器正在完成它的工作。

SQL(和类似语言)的一个目的是编写一个查询,指定你想要的,而不是你想要的,并让查询系统处理如何。

在这种情况下,查询优化器规则最终会使用相同的实际查询执行计划。根据以后的数据量,这可能会也可能不会改变。我的猜测是不会。

对于第一个中的*,您可以尝试使用1,它可以正常工作,在这种情况下,它可以用作“数据”的占位符。

答案 1 :(得分:2)

在sql server 2005和更早的版本中,EXISTS一旦找到它的记录就会更快,它将会失效。 IN将从子查询中收集所有数据进行处理。

但是在最新版本的sql server中,查询优化器足够聪明,通常可以生成更好的计划