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

本文关键字:EF 查询 速度 Take 为什么 | 更新日期: 2023-09-27 18:27:22

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

换句话说,添加Take加快了的查询速度,尽管并没有改变结果。是什么原因造成的?

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

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

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

例如,使用索引并不总是加快查询速度。如果您的记录少于(大约)1000条,那么所涉及的开销实际上会降低查询速度。也许DB选择了简单的表扫描,而不是以前使用的更复杂的查询计划。

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

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

这里有一个很好的答案,说明为什么即使对于相同大小的数据集,select top N也比标准select更快。这很可能是你看到的加速。