实体框架MVC慢页面加载

时间:2012-05-02 13:46:29

标签: asp.net sql-server asp.net-mvc-3 entity-framework

我在Windows Azure上运行了一个Web应用程序。 它使用存储库模式使用ASP.Net 4.0,MVC 3,Entity Framework 4.1,SQL Server 2008构建。

应用程序表现非常好,直到最近。我们的大多数客户都有几百行数据,但其中一行已开始达到2000+。这大大减慢了页面加载时间(在某些页面上为15 - 20秒)。

我们刚刚开始使用MiniProfiler,这表明我们有一个非常繁琐的应用程序 - 有重复的SQL调用。

为了尽可能多地提供细节并弄清楚我们如何做得更好,我会解释一些正在做的事情。

我们有一个基本控制器,它有两个受保护对象(CurrentUser和CurrentCompany)。我们在动作中使用了这些,但每次都会击中DB。所以,我假设我们需要在第一次将这些对象存储在会话中。围绕这些物体会有很大的开销吗?稍后访问他们的关系怎么样(CurrentCompany.Offices.First()等)?

我们根据这些对象获取每个页面的数据:选择,排序,过滤它们之间的关系,例如:

CurrentCompany.Employees.Where(r => r.StatusId = Enums.Statuses.Active);

这里'CurrentCompany.Employees'返回一个EntityCollection,但Where将其更改为IEnumerable。我听说IQueryable是要走的路?

我还读过EF很高兴能够快速启动并运行,但是你必须做一些调整以确保它能够很好地处理大量数据。根据我的阅读,即使你只要求2列,它也会带回整行?

所以,考虑到所有这些 - 有人可以指出我应该做些什么来为更大的客户做出这种规模。毕竟2000多行并不是那么多。我们应该使用views / stored procs吗?

有很多资源可以解释如何通过基本选择等方式获得EF设置 - 但是一旦数据集变大,就没有任何东西可以用来进行scalling。

非常感谢任何帮助。 布赖恩

3 个答案:

答案 0 :(得分:3)

奇怪的是,线索可能在2000行中。当选项通过0.1%的数据集时,SQL会更改访问数据的方式。您没有说明表上是否有适当的索引。 http://www.sqlteam.com/article/sql-server-indexes-the-basics 可能有帮助 如果您运行SQL管理工作室,那么缺少索引功能 http://msdn.microsoft.com/en-us/library/ms345524.aspx

HTH

也在这里 http://blogs.msdn.com/b/sqlazure/archive/2010/08/19/10051969.aspx

答案 1 :(得分:1)

你在做多少急切加载?这是我们发现的一个主要性能损失,解决它我们开始使用Entlib Caching Application Block缓存属性 然后将它们从缓存中合并到对象中,然后从DB中获取它们

答案 2 :(得分:0)

根据我自己的经验,EF非常慢,因为它使用LINQ(非常慢) 我有一个个人网站(显示多种数据的主页,所以我不得不在LINQ中对数据库服务器做多个请求)。它非常慢,我试图用延迟加载选项调整EF .edmx等......我发现的唯一解决方案是摆脱linq,并在ado.net中重写它,它需要更多的时间来代码,但我摆脱速度问题..... LINQ请求必须转换为sql,在到达数据库之前有很多步骤,当它获取数据(select *)时,它会将其转换为EF中的对象模型列表。 谢谢你