首先让我说,这不是对效率或流程改变的要求,而仅仅是学术性的要求。我只是想找个解释我没料到的
我有一个非常简单的查询来驱动内部报告。说到这里,就会有一组数据被加载到一个临时表中,我们称之为“#Sample”。
企业要求在这个临时表中为某个“类型”小部件添加一个排除项。我们将把包含这些类型的字段称为“排除”。
更多一些信息:
所以,基本上:
Select
S.*
FROM #Sample
INNER JOIN [Table with exclusion field]
on [generic unique id]
and [exclusion] not in ('AA','AB')最初的查询(基本上选择*从#样例运行大约1.5秒。进行原始排除的查询也是一样的。
然后,以典型的方式,他们希望看到所有记录的列表,这些记录将根据它们提供的类型被排除在外。
“伊西”,我在一个星期五下午4点对自己说。唯一的更改是删除最后连接中的“Not”。
Select
S.*
FROM #Sample
INNER JOIN [Table with exclusion field]
on [generic unique id]
and [exclusion] in ('AA','AB')但是,当我去生成要排除的记录列表时,我在120秒后取消了查询,觉得这太长了。
别担心。我在概念上走了另一条路,并产生了所要求的列表;然而,我最感兴趣的是' in‘和'NOT IN’之间的性能差异。
最后,我返回结果中的排除字段,导出并排序,在大约1.5秒的执行时间内生成详细信息。
更确切地说,为什么会有区别呢?
提前谢谢你。
发布于 2015-03-06 22:01:56
当SQL Server通过痛苦的行(RBAR)对集合(而不是行)进行操作时,它的工作效果最好。通常,当查询中有“not”时,就会产生RBAR而不是SARGABLE查询。如果一个'not‘可以避免,它应该是,并将导致更快的结果。
https://stackoverflow.com/questions/28907905
复制相似问题