为什么使用Take()似乎可以加速我的EF查询?

时间:2015-12-19 20:35:06

标签: c# entity-framework linq sql-server-2008

我有一个复杂的LINQ to EF查询超时。在调试时我添加了Take(200)并且没有超时。奇怪的是它只返回了127行!

换句话说,添加Take加快查询即使它也没有改变结果。可能是什么造成的?

为了澄清,生成的SQL完全相同,只是Take(200) EF将TOP 200添加到SELECT

2 个答案:

答案 0 :(得分:5)

我的猜测是,此更改导致数据库选择另一个查询计划。作为最新返回200条记录的数据库,它选择了一种更适合返回少量记录的算法(对于数据库来说,200更小)。

例如,使用索引并不总能加快查询速度。如果你有少于(非常大约)1000条记录,所涉及的开销实际上可能会减慢查询速度。也许数据库选择了一个简单的表扫描,而不是之前使用的更复杂的查询计划。

如果您想确切知道发生了什么,您将不得不使用数据库提供的工具来分析这两种变体的查询计划。不幸的是,这些查询计划并不容易理解,因为它们需要相当深入的数据库知识。

在Microsoft SQL Server Management Studio中,您可以调用菜单查询> 从查询窗口显示动画执行计划

答案 1 :(得分:2)

There's a nice answer here关于为什么选择前N比标准选择更快,即使对于相同大小的数据集也是如此。这可能是你所看到的加速。