我有一个复杂的LINQ to EF查询超时。在调试时我添加了Take(200)
并且没有超时。奇怪的是它只返回了127行!
换句话说,添加Take
加快查询即使它也没有改变结果。可能是什么造成的?
为了澄清,生成的SQL完全相同,只是Take(200)
EF将TOP 200
添加到SELECT
。
答案 0 :(得分:5)
我的猜测是,此更改导致数据库选择另一个查询计划。作为最新返回200条记录的数据库,它选择了一种更适合返回少量记录的算法(对于数据库来说,200更小)。
例如,使用索引并不总能加快查询速度。如果你有少于(非常大约)1000条记录,所涉及的开销实际上可能会减慢查询速度。也许数据库选择了一个简单的表扫描,而不是之前使用的更复杂的查询计划。
如果您想确切知道发生了什么,您将不得不使用数据库提供的工具来分析这两种变体的查询计划。不幸的是,这些查询计划并不容易理解,因为它们需要相当深入的数据库知识。
在Microsoft SQL Server Management Studio中,您可以调用菜单查询> 从查询窗口显示动画执行计划。
答案 1 :(得分:2)
There's a nice answer here关于为什么选择前N比标准选择更快,即使对于相同大小的数据集也是如此。这可能是你所看到的加速。