Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注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中添加优化程序提示以强制优化程序选择更好的计划,因此我看到了两个选择。

  • 在选择的中检索/包含的所有列上都添加了覆盖索引/索引 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?

    10-02 01:40
    查看更多