在哪里声明的性能差异

时间:2012-06-08 10:59:48

标签: sql sql-server sql-server-2008 sql-server-2008-r2

1-以下命令的性能差异是什么?

 ... Where ID in (1,2,3)


... where ID = 1 OR ID = 2 OR ID = 3

2-以下命令的性能差异(条件优先级)?

... where Condition1 and condition2  ->  ... where condition2 and condition1
... where Condition1 OR condition2  ->  ... where condition2 OR condition1

2 个答案:

答案 0 :(得分:3)

以下两种类型没有区别;无论如何,在运行时,您的数据库引擎会将IN子句展平为OR'd堆栈。因此IN(1,2,3)将扩展为col = 1 OR col = 2 OR col = 3

... Where ID in (1,2,3)   

... where ID = 1 OR ID = 2 OR ID = 3

答案 1 :(得分:1)

我认为性能没有显着差异。如果查看执行计划,SQL Server会在数据加载步骤中嵌入过滤。当从磁盘读取数据并将其加载到磁盘页面时,会发生这种情况。与I / O的变幻莫测相比,花费一个周期比另一个更快的基本没有效果。

“in”运算符的一个典型实现是作为小哈希表。对于三个元素,这可能比顺序比较慢。但是,对于更多的比较,“in”方法会更快。对于数字来说尤其如此,因为内置的硬件比较会非常快。还要记住,编译器知道“in”列表中的内容,因此如果数据库设计者认为这是一个值得进行的优化,它可以选择进行顺序比较。我怀疑他们会这么认为。

回应亚伦的评论。我的信念是基于IN可以返回的两个错误:

错误8623: 查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询。请简化查询。如果您认为自己错误地收到了此消息,请与客户支持服务部​​门联系以获取更多信息。

错误8632: 内部错误:已达到表达式服务限制。请在查询中查找可能复杂的表达式,并尝试简化它们。

(http://msdn.microsoft.com/en-us/library/ms177682.aspx)

我不熟悉WHERE子句中逻辑公式的这些错误。因此,我做了一个大概的假设,即底层实现是使用哈希表。