为啥使用 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 查询? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在elasticsearch慢查询中take_millis和超时之间有很多时间成本