【问题标题】:Linq Query slow on host but not on dev machine主机上的 Linq 查询速度很慢,但在开发机器上却没有
【发布时间】:2010-01-01 18:57:04
【问题描述】:

我正在使用 Entity Framework 运行 ASP.NET MVC 2 Preview 2(带有 VS 2010 Beta 2)。

昨天早些时候,由于某种未知原因,我的应用程序中的一个页面开始在我的主机上加载非常缓慢。

问题是,这只发生在我的主机上,我没有改变任何东西让它加载缓慢。

这是加载非常缓慢的动作:

public ActionResult Index()
{
    MyEntitiesContext db = new MyEntitiesContext();
    IEnumerable<City> cities = db.Cities.Where(x => x.Orders.Count != 0).OrderBy(x => x.Name);
    return View(cities);
}

这是我的 Index.aspx

       <ul>
         <% foreach (City g in Model){ %>
            <li>
              <%= Html.ActionLink(g, "View", "Cities", new { CityID = g.CityID}, null)%>(<%= g.City %>)
           </li>         
         <% } %>
       </ul>

现在这在我的开发机器上运行良好,并且在我的主机上运行良好,直到昨晚深夜。

以下是我测试的一些诊断:

  1. 代码在我的开发机器上使用我的开发机器的 SQL 数据库可以正常工作/加载
  2. 当我将开发机应用程序上的连接字符串切换到我的主机 sql 服务器时,代码需要永远加载
  3. 当我使用 LINQ Pad 对我的开发机器 SQL 服务器运行 LINQ 时,它运行得很快(0.3 秒),当我对主机的 SQL 服务器运行它时,它也运行得很快(0.3 秒)
  4. 有一次我使用主机的 SQL 服务器作为连接字符串并在 VS 2010 调试中运行应用程序,一段时间后,我收到此错误

    Execution of the command requires an open and available connection. 
    The connection's current state is broken.
    

表格 Cities 有超过 7000 行,(截至目前)只有大约 4-5 行实际有 Orders(所以这些就是将显示的那些)。

我和我的主人谈过,他们说他们没有发现服务器有任何问题(这是有道理的,因为网站上查询服务器的其他页面运行良好)。他们重新启动了它,但我的加载时间仍然很慢。

这是一个奇怪的问题,我不知道是什么原因造成的,非常感谢任何帮助。

更新 1:

这是秒表结果

        Stopwatch s = new Stopwatch();
        s.Start();
        IEnumerable<City> cities = db.Cities.Where(x => x.Orders.Count != 0).OrderBy(x => x.Name);
        s.Stop();
        long t = s.ElapsedTicks;
        return View(cities);

当我在 return View(cities) 处设置断点时,t 的值是 387,这是有道理的,因为城市只是在做声明,这也意味着问题在于执行声明的 foreach在视图中。

由于我无法在视图中放置断点,因此我继续执行以下操作:

        s.Start();
        List<City> list = cities.ToList();
        s.Stop();
        long q = s.ElapsedTicks;

模拟执行语句(据我了解,在IEnumerable 上运行foreach 相当于调用.ToList()

过了很长一段时间(注意:我还在连接字符串中使用我的共享主机的 SQL 服务器),q 的值是890489194。所以问题是执行查询。这是否表明 SQL 数据库/服务器存在问题?

更新 2:

如果我这样重写查询:

  db.Orders.Select(x => x.City).Distinct();

这运行速度很快,页面加载良好。我唯一关心的是缩放。哪个查询更适合大型数据库。

同样,每个Order 都有一个与之关联的City,而City 可以有多个Orders

【问题讨论】:

  • 我建议您弄清楚滞后来自何处.. DB 或 View。在 IEnumerable cities = db.Cities.Where(x => x.Orders.Count != 0).OrderBy(x => x.Name) 之前制作 2 个时间戳之后。并消除当时的视图逻辑。
  • @Alexander Taran - 查看更新 1 的结果。
  • 不枚举IEnumerable时,不会执行DB查询,所以计时关闭。确保遍历它,并触摸视图使用的相同属性。
  • @Sander Rijken - 检查更新 2

标签: sql-server asp.net-mvc linq-to-entities performance


【解决方案1】:

我要出来说你需要一个索引来连接你的Order 表。

【讨论】:

  • 您能否提供一些有关如何设置的链接/教程?
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
相关资源
最近更新 更多