Linq Query在主机上运行缓慢但在dev机器上运行缓慢

时间:2010-01-01 18:57:05

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

我正在使用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. ,代码可以在我的开发机器上正常工作/加载
  3. 当我将我的开发机器应用程序上的连接字符串切换到我的主机sql server时,代码将永远加载
  4. 当我使用LINQ Pad针对我的开发机器SQL服务器运行LINQ时,它运行速度快(.3秒),当我针对主机的SQL服务器运行它时,它也快速运行(.3秒)
  5. 有一次我使用我的主机的SQL服务器作为连接字符串并在VS 2010调试中运行了应用程序,一段时间后,我收到了此错误

    Execution of the command requires an open and available connection. 
    The connection's current state is broken.
    
  6. 表城市有超过7000行,(截至目前)只有大约4-5行实际上有订单(所以这些是将要显示的行)。

    我和我的主人谈过,他们说他们没有看到服务器有什么问题(这是有道理的,因为网站上查询服务器的其他页面运行正常)。他们重新启动它,但我仍然得到相同的缓慢加载时间。

    这是一个奇怪的问题,我不知道是什么导致这种情况,任何帮助都会大大增加。

    更新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这是有道理的,因为城市只是在发表声明,这也意味着问题在于{ {1}}执行视图中的语句。

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

    foreach

    模仿执行语句(根据我的理解,在 s.Start(); List<City> list = cities.ToList(); s.Stop(); long q = s.ElapsedTicks; 上运行foreach等同于调用IEnumerable

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

    更新2:

    如果我这样重写查询:

    890489194

    运行速度很快,页面加载正常。我唯一担心的是缩放。哪个查询对大型数据库更好。

    同样,每个 db.Orders.Select(x => x.City).Distinct(); 都有一个Order与之关联,City可以有多个City

1 个答案:

答案 0 :(得分:1)

我要出来说你需要一个加入你Order表的索引。