我正在使用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>
现在这在我的开发机器上工作得非常好,它在我的主机上工作正常,直到昨晚。
以下是我测试过的一些诊断信息:
LINQ Pad
针对我的开发机器SQL服务器运行LINQ时,它运行速度快(.3秒),当我针对主机的SQL服务器运行它时,它也快速运行(.3秒)有一次我使用我的主机的SQL服务器作为连接字符串并在VS 2010调试中运行了应用程序,一段时间后,我收到了此错误
Execution of the command requires an open and available connection.
The connection's current state is broken.
表城市有超过7000行,(截至目前)只有大约4-5行实际上有订单(所以这些是将要显示的行)。
我和我的主人谈过,他们说他们没有看到服务器有什么问题(这是有道理的,因为网站上查询服务器的其他页面运行正常)。他们重新启动它,但我仍然得到相同的缓慢加载时间。
这是一个奇怪的问题,我不知道是什么导致这种情况,任何帮助都会大大增加。
这是秒表结果
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数据库/服务器问题的明显迹象?
如果我这样重写查询:
890489194
运行速度很快,页面加载正常。我唯一担心的是缩放。哪个查询对大型数据库更好。
同样,每个 db.Orders.Select(x => x.City).Distinct();
都有一个Order
与之关联,City
可以有多个City
。
答案 0 :(得分:1)
我要出来说你需要一个加入你Order
表的索引。