我们有一个正在运行的应用程序,它可以强制使用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项
获得10件物品
获得50件物品
获得100件物品
获得250件物品
获得500件物品
获得1000件物品
所以看起来,虽然OLD方法从第一次执行开始就非常慢,但由于查询繁重,它会慢慢增加#34;因为我从数据库中获得了越来越多的项目。
我想说,一旦数据包长大,将其传输到调用机器的时间就高于数据库时间。 愿这真的是原因吗?
由于 马可