为什么使用GreaterThan(>)和LessThan(<)比较使用Equal(=)的整数需要800ms?

时间:2015-02-25 14:16:13

标签: sql .net linq

使用Linq和EntityFramework,我们最近注意到,在测试我们的查询性能时,使用Equal(=)运算符来比较两个整数比使用GreaterThan(>)和LessThan(<)的组合需要大约800ms运算符。

所以基本上,在我们的linq查询中用itemID == paramID替换!(itemID > param ID || itemID < paramID)(两者都是整数)会使查询的速度提高约800毫秒。

任何对SQL有深入了解的人都可以向我解释这个结果吗?

2 个答案:

答案 0 :(得分:1)

如果这总是更快,SQL Server会为您重写。它不是这样你可以得出结论,总是更快地做到这一点。实际上,在99.999%的情况下重写是一个坏主意。

问题中给出的信息(几乎没有)不允许进一步分析。

通常人们会问&#34;为什么这种随机变化会使我的查询更快?#34;答案总是如此:您不小心触发了更好的查询计划。它没有系统。查询计划可能不稳定。

心理猜测:复杂谓词强制表扫描(或使其看起来更好)比使用索引。这有时可能是一件好事。

答案 1 :(得分:0)

第一步是检查生成的sql。我的猜测是itemIDnullable,而EntityFramework的默认行为是可以为空的属性并不是最大的。它会将您的查询翻译为:prop = value OR prop is null

如果是这种情况并且您使用的是EF6,则可以通过以下方式覆盖该行为:

context.UseDatabaseNullSemantics = true;

Msdn