1

我正在尝试优化一些存储过程,它们非常频繁地使用 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)

Exists 的执行周期

使用 IN 查询

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

IN的执行周期

使用 ANY 查询

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

在此处输入图像描述

4

2 回答 2

3

它的结果是一样的,因为查询优化器正在做它的工作。

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

在这种情况下,查询优化器规则最终具有相同的实际查询执行计划。这可能会或可能不会改变,具体取决于以后的数据量。我的猜测是不会。

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

于 2013-07-09T18:55:39.177 回答
2

在 sql server 2005 和更早的版本中,EXISTS 会更快,因为一旦找到它的记录,它就会退出进程。而 IN 将收集来自子查询的所有数据进行处理。

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

于 2013-07-09T19:52:14.217 回答