Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么使用Take()似乎可以加快EF查询的速度?_C#_Entity Framework_Linq_Sql Server 2008 - Fatal编程技术网

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

C# 为什么使用Take()似乎可以加快EF查询的速度?,c#,entity-framework,linq,sql-server-2008,C#,Entity Framework,Linq,Sql Server 2008,我有一个复杂的LINQ-to-EF查询超时了。调试时,我添加了一个Take(200),它没有超时。奇怪的是它只返回了127行 换句话说,添加Take可以加快查询速度,即使它不会改变结果。是什么原因造成的 为澄清起见,生成的SQL完全相同,只是在Take(200)EF中将top200添加到SELECT中,说明为什么即使对于相同大小的数据集,SELECT TOP N也比标准SELECT快。这可能是您看到的加速 我猜这一变化导致数据库选择了另一个查询计划。由于新数据库最多返回200条记录,因此它选择了

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

换句话说,添加
Take
可以加快查询速度,即使它不会改变结果。是什么原因造成的


为澄清起见,生成的SQL完全相同,只是在
Take(200)
EF中将
top200
添加到
SELECT

中,说明为什么即使对于相同大小的数据集,SELECT TOP N也比标准SELECT快。这可能是您看到的加速

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

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

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


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

您是否比较了使用和不使用
Take(200)
的查询生成的SQL,您可以检查生成的sql@AlbertoMonteiro它将
TOP200
添加到
SELECT
中,与您期望的完全相同。它不做任何其他更改。您是否尝试在SQL Management Studio中执行从查询生成的SELECT而不使用Take?它会超时吗?@AlbertoMonteiro在SSMS中没有速度差。虽然链接文章可能会回答这个问题,但最好在这里引用相关部分。链接内容可能会更改或删除,但您的答案对未来的so用户也应该有用。这很公平。谢谢你的提示。有没有一种方法可以比较查询计划并验证是否是这样的?这是针对SQL Server 2008运行的。@just.other.programmer yesm请查看此评论