4

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

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

我们刚开始使用 MiniProfiler,这表明我们有一个非常健谈的应用程序——带有重复的 SQL 调用。

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

我们有一个包含两个受保护对象(CurrentUser 和 CurrentCompany)的基本控制器。我们在 Actions 中使用了很多这些,但它每次都会命中数据库。所以,我假设我们需要在第一次将这些对象存储在会话中。围绕这些对象集结是否有很大的开销?以后如何访问他们的关系(CurrentCompany.Offices.First() 等)?

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

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

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

我还读到 EF 非常适合快速启动和运行,但您必须进行一些调整以确保它在处理大量数据时表现良好。根据我的阅读,即使您只要求 2 列,它也会带回整行?

因此,考虑到所有这些 - 有人可以指出我应该做些什么来为更大的客户制作这个规模。毕竟 2000 多行并不多。我们应该使用视图/存储过程吗?

那里有大量的资源来解释如何使用基本选择等进行 EF 设置 - 但一旦数据集变得更大,就没有真正的缩放它。

任何帮助将不胜感激。布赖恩

4

3 回答 3

3

奇怪的是,线索可能在 2000 行中。SQL changes the way it accesses data when the choice passes 0.1% of the dataset. 您没有说表上是否有适当的索引。 http://www.sqlteam.com/article/sql-server-indexes-the-basics 可能会有所帮助 如果您运行 SQL 管理工作室,那么缺少索引功能 http://msdn.microsoft.com/en-us/库/ms345524.aspx

高温高压

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

于 2012-05-02T13:59:17.207 回答
1

你在做多少急切的加载?这是我们发现对性能造成重大影响的一件事,为了解决这个问题,我们开始使用Entlib 缓存应用程序块缓存属性 ,然后将它们从缓存中合并到对象中,而不是从数据库中获取它们

于 2012-05-02T14:05:50.477 回答
0

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

于 2012-05-17T14:43:32.220 回答