“IN”v。“不在”Sql性能

时间:2015-03-06 21:23:28

标签: sql sql-server

首先我要说的是,这不是效率或流程变更的要求,仅仅是学术性的。我正在寻找一些我没想到的事情的解释

我有一个非常简单的查询来驱动内部报告。当它归结为它时,有一组数据被加载到临时表中,我们将调用###Sample'。

该公司已要求为某种类型的'添加排除功能。此临时表中的小部件。我们会调用包含这些'类型',[排除]的字段。

更多信息:

  • #Sample不会超过1200条记录
  • [exclusions]是varchar(2)
  • 正好有两个[排除]
  • #Sample与[排除字段表]
  • 之间存在1:1的关系

所以,基本上:

Select
S.*
FROM #Sample
INNER JOIN [Table with exclusion field]
   on [generic unique id]
   and [exclusion] not in ('AA','AB')

原始查询(基本上是Select * From #Sample在大约1.5秒内运行。使原始排除的查询大致相同。

然后,以典型的方式,他们希望查看将根据其提供的类型排除的所有记录的列表。

'易'我想在星期五下午4点对自己说。唯一的改变就是删除“不是”。在最后的加入。

Select
S.*
FROM #Sample
INNER JOIN [Table with exclusion field]
   on [generic unique id]
   and [exclusion] in ('AA','AB')

然而,当我去制作要排除的记录列表时,我在120秒后取消了查询,感觉这太长了。

不用担心。我从概念上沿着另一条路走下去并制作了所要求的清单;但是,我对' IN'之间的性能差异最感兴趣。并且' NOT IN'。

最终,我返回结果中的[exclusion]字段,导出并排序,以便在大约1.5秒的时间内生成详细信息。

更准确地说,为什么会有什么不同?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

SQL Server在通过痛苦行(RBAR)操作集合时效果最佳。通常情况下,如果没有'在查询中,它导致RBAR而不是SARGABLE查询。如果不是'可以避免它应该是,并将导致更快的结果。