0

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
4

2 回答 2

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
于 2012-06-08T11:06:32.010 回答
1

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

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

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

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

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

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

我不熟悉关于 WHERE 子句的逻辑表述的这些错误。因此,我做出了一个可能轻率的假设,即底层实现是使用哈希表。

于 2012-06-08T11:18:25.850 回答