Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
7年前关闭。
Improve this question
为什么使用
1)立即调用
2)在调用
更新和解决
获得生成的SQL后,唯一的区别是,正如预期的那样,在第一个查询中添加了 在选择的中检索/包含的所有列上都添加了覆盖索引/索引 View ,这很荒谬,但我认为它可以工作,因为该索引将使优化程序容易地选择最佳计划。 始终过早实现包含“第一”或“最后”或“服用”的查询。危险,因为随着数据变大,在本地提取所有数据与执行First()以及对服务器上的Top进行查询之间的收支平衡点将发生变化。
http://geekswithblogs.net/Martinez/archive/2013/01/30/why-sql-top-may-slow-down-your-query-and-how.aspx
https://groups.google.com/forum/m/#!topic/microsoft.public.sqlserver.server/L2USxkyV1uw
http://connect.microsoft.com/SQLServer/feedback/details/781990/top-1-is-not-considered-as-a-factor-for-query-optimization
TOP slows down query
Why does TOP or SET ROWCOUNT make my query so slow?
想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
7年前关闭。
Improve this question
为什么使用
ToList()
强制实现时我的查询数量级更快(如果有的话)应该恰好相反? 1)立即调用
First()
// "Context" is an Entity Framework DB-first model
var query = from x in Context.Users
where x.Username.ToLower().Equals(User.Identity.Name.ToLower())
select x;
var User = query.First();
// ** The above takes 30+ seconds to run **
2)在调用
First()
之后调用ToList()
: var query = from x in Context.Users
where x.Username.ToLower().Equals(User.Identity.Name.ToLower())
select x;
var User = query.ToList().First(); // Added ToList() before First()
// ** Now it takes < 1 second to run! **
更新和解决
获得生成的SQL后,唯一的区别是,正如预期的那样,在第一个查询中添加了
TOP (1)
。就像Andyz Smith在下面的回答中所说,根本原因是在添加TOP (1)
的情况下,在这种特殊情况下,SQL Server优化器选择了较差的执行计划。因此,该问题与LINQ(通过添加TOP (1)
做对的事情)无关,与与SQL Server的特性无关。 最佳答案
因此,优化器选择了一种错误的方式来运行查询。
由于您无法在SQL中添加优化程序提示以强制优化程序选择更好的计划,因此我看到了两个选择。
http://geekswithblogs.net/Martinez/archive/2013/01/30/why-sql-top-may-slow-down-your-query-and-how.aspx
https://groups.google.com/forum/m/#!topic/microsoft.public.sqlserver.server/L2USxkyV1uw
http://connect.microsoft.com/SQLServer/feedback/details/781990/top-1-is-not-considered-as-a-factor-for-query-optimization
TOP slows down query
Why does TOP or SET ROWCOUNT make my query so slow?