【问题标题】: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 中没有速度差异。

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


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 虽然链接的文章可能会回答问题,但最好在此处引用相关部分。链接的内容可能会更改或被删除,但您的回答应该对未来的用户有用。
  • 很公平。谢谢你的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多