【发布时间】:2011-11-20 13:34:07
【问题描述】:
我有一个由实体框架支持的 WCF RIA 服务域服务。实体模型相当复杂。一般来说,大多数操作的性能都可以。
但是我的 Silverlight 客户端包含一个主/详细信息视图。主视图是实体列表。在实体之间单击以选择它们会触发服务器上的 IQueryable GetEntity() 方法,这平均需要 5 秒 - 这是不可接受的时间量。
我使用 Fiddler 查看网络上的呼叫,我可以看到我所有的时间都花在了服务器上:
ServerGotRequest: 15:59:44.545
ServerBeginResponse:15:59:48.836
ServerDoneResponse: 15:59:48.836
ClientBeginResponse:15:59:48.836
ClientDoneResponse: 15:59:48.836
Overall Elapsed: 00:00:04.2940000
返回的数据,正如它在网络上显示的那样,也非常小。在这个例子中,大约 6kb。
好的 - 所以我的问题是服务器端。对 EF 的查询相当简单,有一个警告:我们有大约 25 个 .Include 语句来引入相关实体。 .Includes 选择实体最多 4 层深度(例如 .Include("1.2.3.4"))。
所以我的下一个想法是数据库很慢。不是这样 - 我运行 SQL Profiler 并看到(诚然可怕的)SQL 平均在 0.15 秒内被执行。返回的数据还不错 - 3 行,大约 275 列。
所以:
- 我的瓶颈在服务器上
- 我通过直接 EF 查询选择多个相关实体
- 生成的 SQL 很丑,但速度够快
那我为什么慢?我该如何调试?
如果我在 IQueryable GetEntity() 方法的末尾设置断点,似乎在退出该方法后,实际查询出现在 SQL Profiler 中之前最多需要 3 秒。什么鬼?
请注意,我已经预先生成了我的实体框架视图,并且我尝试使用编译查询来排除 EF 的“预热”时间。没有区别。
感谢您对此问题的任何帮助。提前致谢。
【问题讨论】:
-
你有没有找到一个可接受的答案来解决这个问题?我看到每次调用 RIA 服务的开销约为 0.8 秒。如果服务仅返回 DTO 而不是访问数据库或执行任何其他可能很慢的操作,则发生事件。
-
@Josh 看到我自己接受的答案。您需要弄清楚延迟在哪里;分析 Fiddler 中的网络调用和 SQL Profiler 中的 DB 调用,看看您在客户端、线路或服务器上是否速度较慢。
-
谢谢。通过在我的代码中随处插入 ASP.Net 服务器跟踪,我找到了开销的原因。它最终是由 Unity 库内部抛出的大量异常引起的。大多数人认为它是 Unity 中的一个错误,但其作者除外。
标签: silverlight entity-framework wcf-ria-services