为啥使用 Take() 似乎加快了我的 EF 查询? [复制]

Posted

技术标签:

【中文标题】为啥使用 Take() 似乎加快了我的 EF 查询? [复制]【英文标题】:Why does using Take() seem to speed up my EF query? [duplicate]为什么使用 Take() 似乎加快了我的 EF 查询? [复制] 【发布时间】:2015-12-19 20:35:05 【问题描述】:

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

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

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

【问题讨论】:

您是否比较了使用Take(200)和不使用Take(200)从查询生成的SQL? 嗯,你可以查看生成的sql @AlbertoMonteiro 它将TOP 200 添加到SELECT,就像您期望的那样。它没有进行其他更改。 您是否尝试在不使用 SQL Management Studio 的情况下从查询中执行生成的 SELECT?它会超时吗? @AlbertoMonteiro 在 SSMS 中没有速度差异。 【参考方案1】:

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

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

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

在 Microsoft SQL Server Management Studio 中,您可以从查询窗口调用菜单 Query > Display Esimated Execution Plan

【讨论】:

有没有办法比较查询计划并验证是否是这种情况?这是针对 SQL Server 2008 运行的。 @just.another.programmer yesm 看看这条评论***.com/questions/34375126/…【参考方案2】:

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

【讨论】:

虽然链接的文章可能会回答问题,但最好在此处引用相关部分。链接的内容可能会更改或被删除,但您的回答应该对未来的用户有用。 很公平。谢谢你的提示。

以上是关于为啥使用 Take() 似乎加快了我的 EF 查询? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

第一次调用后,对不同数据库上下文的 EF 查询似乎缓存

为啥`arr.take(idx)`比`arr[idx]`快

为啥在elasticsearch慢查询中take_millis和超时之间有很多时间成本

链接器多重定义错误:为啥 <thread> 似乎定义了我的函数?

如何使用多个 INNER JOIN 加快查询速度

加快我的 SQL 查询速度?它给出了执行超时错误