实体框架性能注意事项

时间:2015-06-12 14:19:46

标签: performance entity-framework entity-framework-4.1 azure-sql-database

我们有一个正在运行的应用程序,它可以强制使用EF 4.1版。现在没有安排更新,但这不是重点。

我们正在进行大规模优化,因为Sql Server数据库上的工作负载非常高。我成功地(在从未成功之后)成功地分析了已发送的查询(我们在Sql Azure下),并且我发现由于使用了包含的愚蠢而发送了许多可怕的查询。我们删除了所有可避免的"包含",通过对集合进行直接查询(即之前的10次查询)替换它们,并且Sql Server上的总工作量大大减少。

但后来我发现全局代码运行速度较慢。怎么可能这样呢?我开始跟踪,我发现即使查询的处理时间少于50毫秒,EF也需要1秒多的时间来实现实体。太可怕了。它通过ADO.Net比普通的sql查询多2个度数。

我尝试通过禁用集合上的实体跟踪并使用AsNoTracking()查询集合,但似乎没有任何变化。

我从未有可能分析查询处理和对象实现之间的总分割时间,但我从未想过那是影响。还有我可以尝试的吗?

-

更新2015/06/15 - 效果分析

我运行了7组不同的测试,每次测试都运行了10次。我使用旧版本(包含大量包含的1个大查询)和新版本(每个旧包含的1个小查询)跟踪执行.NET代码的总时间。

我想说问题是,正如Jeroen Vannevel在评论中所说,多个请求/响应的延迟。 以下是总结结果。当我写" item"我的意思是一个复杂的实体,由至少10个不同的实体组成,取自10个不同的数据库表。

从数据库中获取1项

  • OLD方法:平均3.5秒
  • 新方法:平均276毫秒

获得10件物品

  • OLD方法:平均3.6秒
  • 新方法:平均340毫秒(+ 23%)

获得50件物品

  • OLD方法:平均4.0秒
  • 新方法:平均440毫秒(+ 30%)

获得100件物品

  • OLD方法:平均4.5秒
  • 新方法:平均595毫秒(+ 35%)

获得250件物品

  • OLD方法:平均5.7秒
  • 新方法:平均948毫秒(+ 60%)

获得500件物品

  • OLD方法:平均5.9秒
  • 新方法:平均1.8秒(差不多+ 100%)

获得1000件物品

  • OLD方法:平均6.9秒
  • 新方法:平均5.1秒(超过+ 180%)

所以看起来,虽然OLD方法从第一次执行开始就非常慢,但由于查询繁重,它会慢慢增加#34;因为我从数据库中获得了越来越多的项目。

我想说,一旦数据包长大,将其传输到调用机器的时间就高于数据库时间。 愿这真的是原因吗?

由于 马可

0 个答案:

没有答案