【发布时间】: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>
现在这在我的开发机器上运行良好,并且在我的主机上运行良好,直到昨晚深夜。
以下是我测试的一些诊断:
- 代码在我的开发机器上使用我的开发机器的 SQL 数据库可以正常工作/加载
- 当我将开发机应用程序上的连接字符串切换到我的主机 sql 服务器时,代码需要永远加载
- 当我使用
LINQ Pad对我的开发机器 SQL 服务器运行 LINQ 时,它运行得很快(0.3 秒),当我对主机的 SQL 服务器运行它时,它也运行得很快(0.3 秒) -
有一次我使用主机的 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