使用Linq和EntityFramework,我们最近注意到,在测试我们的查询性能时,使用Equal(=)运算符来比较两个整数比使用GreaterThan(>)和LessThan(<)的组合需要大约800ms运算符。
所以基本上,在我们的linq查询中用itemID == paramID
替换!(itemID > param ID || itemID < paramID)
(两者都是整数)会使查询的速度提高约800毫秒。
任何对SQL有深入了解的人都可以向我解释这个结果吗?
答案 0 :(得分:1)
如果这总是更快,SQL Server会为您重写。它不是这样你可以得出结论,不总是更快地做到这一点。实际上,在99.999%的情况下重写是一个坏主意。
问题中给出的信息(几乎没有)不允许进一步分析。
通常人们会问&#34;为什么这种随机变化会使我的查询更快?#34;答案总是如此:您不小心触发了更好的查询计划。它没有系统。查询计划可能不稳定。
心理猜测:复杂谓词强制表扫描(或使其看起来更好)比使用索引。这有时可能是一件好事。
答案 1 :(得分:0)
第一步是检查生成的sql。我的猜测是itemID
是nullable
,而EntityFramework的默认行为是可以为空的属性并不是最大的。它会将您的查询翻译为:prop = value OR prop is null
如果是这种情况并且您使用的是EF6,则可以通过以下方式覆盖该行为:
context.UseDatabaseNullSemantics = true;