2009-12-04 131 views
2

我正在使用实体框架在我的SQL Server 2008数据库上分层。 EF存在于我的Web服务中,Web服务由Silverlight客户端调用。实体框架性能

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

有一点谷歌搜索显示,它是由每个应用程序域导致构建数据库对象的内存模型。我发现这个微软link解释了性能改进的前景观。即使在实施这些步骤之后,性能实际上也会降低,而不是提高。我很好奇,如果有人已经成功地尝试了这种方法,并且还有其他改进性能的途径。

我正在使用.NET 3.5。

+0

你是否分析过并确定它是因为实体框架还是由于查询本身而变得缓慢? – 2009-12-04 05:15:00

+0

@克里斯:不,我没有。你能抛出一些指针吗? – pencilslate 2009-12-04 05:28:27

回答

2

几个方面来看看EF的性能

  1. 打电话之类的东西tolist之前做尽可能多的处理()。 ToList将把集合中的所有内容放入内存中。默认情况下,EF将继续构建表达式树,并只在需要内存中的数据时才实际处理它。第一个查询将针对数据库,但之后的处理将在内存中。处理大量数据时,您绝对需要尽可能多地完成数据库的繁重工作。
  2. EF 1只能将整行拖回。因此,如果你有一个字符串是一个大的字符串或二进制blob,它将被拉下来,无论你是否需要它。您可以创建一个不包含此列的投影,但是您没有获得将它作为实体的好处。
  3. 你可以看一下使用建议在这个岗位 How do I view the SQL generated by the Entity Framework?
2

相同的物理定律适用于EF查询和普通SQL。检查你的数据库表,并确保你有主键和外键的索引,你的数据库已经正确的标准化,等等。如果微软的建议后性能下降,那么这是我对问题领域的猜测。

0

使用SQL事件探查器检查执行多少个查询来检索您的数据。如果数量很大,则使用Include()方法ObjectQuery在一个查询中检索具有父级的子对象。

1

你托管在IIS web服务由EF生成的SQL?它是否与Silverlight应用程序在同一个网站上运行?数据库本身呢?它是否在专用机器上运行?有其他应用程序击中它吗?第一次打电话到休眠数据库是痛苦的(我曾经有过在我的环境中实际超时的情况。)

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

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

+0

@Mike:我目前正在同一台机器上运行SQL Server的测试平台IIS环境。大约需要2分钟才能完成EF中执行的ToList方法。你会建议我看看还有哪些其他的指针? – pencilslate 2009-12-04 06:10:22

+0

我会说这是一个非问题。然而,一条路线是使用自托管的WCF服务,并在启动过程中将该服务调用为一个简单例程,以便在进行客户端调用之前,它已与SQL Server建立通信。 这里主要的问题是你在同一台机器上测试。如果您在生产机器上发现问题,那么可能值得解决。但有办法缓解它。 – 2009-12-04 14:08:49