实体框架性能

时间:2009-12-04 05:05:35

标签: entity-framework .net-3.5

我正在使用Entity Framework在我的SQL Server 2008数据库上进行分层。 EF存在于我的Web服务中,Web服务由Silverlight客户端调用。

我发现查询在EF中执行的持续时间存在严重的性能问题。这不会发生在连续的呼叫中。

一点点谷歌搜索显示,它是由每个应用程序域构建数据库对象的内存模型。我发现这个Microsoft link解释了性能改进的预生成视图。即使在实施这些步骤之后,性能实际上也会下降而不是改善。我很好奇,如果有人成功地尝试了这种方法,并且还有其他方法可以提高性能。

我使用的是.NET 3.5。

4 个答案:

答案 0 :(得分:2)

同样的物理定律适用于EF查询,就像普通SQL一样。检查数据库表并确保在主键和外键上有索引,数据库已正确规范化,等等。如果在微软的建议之后性能下降,那么这就是我对问题区域的猜测。

答案 1 :(得分:2)

要考虑EF性能的几个方面

  1. 在调用tolist()之前执行尽可能多的处理。 ToList会将集合中的所有内容都带入内存。默认情况下,EF将继续构建表达式树,并且只在您需要内存中的数据时才实际处理它。第一个查询将针对数据库,但之后处理将在内存中。在处理大数据时,您肯定希望尽可能多地完成数据库的繁重工作。
  2. EF 1只能选择拉回整行。因此,如果您有一个大字符串或二进制blob的列,无论您是否需要,它都会被拉下并进入内存。您可以创建一个不包含此列的投影,但是您无法获得将其作为实体的好处。
  3. 您可以使用本文中的建议查看EF生成的sql How do I view the SQL generated by the Entity Framework?

答案 2 :(得分:1)

您是否在IIS中托管了Web服务?它是否与Silverlight应用程序在同一站点上运行?那数据库本身呢?它是在专用机器上运行吗?还有其他应用程序吗?对休眠数据库的第一次调用是痛苦的(我的情况实际上会在我的环境中超时。)

这里有许多因素需要考虑。但它不仅仅是EF的开销。

编辑我没有完全符合条件,但无论您的数据访问解决方案如何,打开与SQL Server的第一个连接的过程都很慢。

答案 3 :(得分:0)

使用SQL事件探查器检查执行检索数据的查询次数。如果使用Include() ObjectQuery {{1}}方法,则在一次查询中使用父项检索子对象。