【问题标题】:sql server 'in' or 'or' - which is fastestsql server 'in' 或 'or' - 最快
【发布时间】:2010-08-18 08:54:53
【问题描述】:

好的,我有一个问题:

select distinct(a)
from mytable
where
b in (0,3)

什么会更快,上面还是

select distinct(a)
from mytable
where
b = 0
or
b = 3

有一般规则吗?

谢谢

【问题讨论】:

  • 你自己没试过吗?

标签: sql sql-server sql-server-2005


【解决方案1】:

INOR 都会查询b = 0,然后查询b = 3,然后对两个结果集进行合并连接,最后过滤掉所有重复项。

对于IN,重复没有意义,因为b 不能同时是03,但事实上IN 将被转换为b = 0 OR b = 3,并且使用OR,重复是有意义的,因为你可以拥有b = 0 OR a = 3,如果你要加入两个单独的结果集,你最终可能会得到与这两个条件匹配的每条记录的重复.

因此,无论您使用的是IN 还是OR,都将始终进行重复过滤。但是,如果您从一开始就知道您不会有任何重复项(通常在您使用 IN 时就是这种情况),那么您可以通过使用不会过滤掉重复项的 UNION ALL 来获得一些性能:

select distinct(a)
from mytable
where
b = 0

UNION ALL

select distinct(a)
from mytable
where
b = 3

【讨论】:

    【解决方案2】:

    据我所知,IN 转换为 OR。所以性能是一样的。只是一种更短的写法。

    【讨论】:

      【解决方案3】:

      希望在这个简单的示例中,您使用哪个版本不会有任何区别(因为查询优化器应该在后台将它们转换为等效的查询),但是它很有可能取决于您拥有的索引在mytable。我建议您在启用“包括实际执行计划”后在 Sql Server Management Studio 中运行这两个查询,并比较结果以确定哪个查询在您的方案中具有最低的“成本”。

      为此:

      1. 将您的查询放入新的 Sql Sever Management Studio 查询窗口中
      2. 在您输入的空间中右键单击窗口
      3. 点击“包括实际执行计划”
      4. 像往常一样运行查询

      窗口底部的“结果”半部分现在将显示第三个选项卡,显示“执行计划”,其中应包含两个“流程图”,一个用于第一个查询,另一个用于第二个查询。如果两者相同,则 Sql Server 将这两个查询视为等效,因此您应该选择您和/或您的同事喜欢的任何形式。

      【讨论】:

      • @harpo,是的,这是我啰嗦的说法“这是你自己解决的方法,因为我知道它会是一样的,但你会从发现中得到更多”到 OP =)
      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 2013-09-08
      • 2016-06-04
      • 1970-01-01
      • 2010-11-11
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多