gpt4 book ai didi

silverlight - WCF RIA 服务查询速度慢

转载 作者:行者123 更新时间:2023-12-04 02:34:06 24 4
gpt4 key购买 nike

我有一个由 Entity Framework 支持的 WCF RIA 服务域服务。实体模型非常复杂。通常,大多数操作的性能都还可以。

但是我的 Silverlight 客户端包含一个主视图/详细 View 。主视图是一个实体列表。在实体之间单击以选择它们会触发服务器上的 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() 方法的末尾设置断点,似乎在退出该方法后最多需要 3 秒的时间,实际查询才会出现在 SQL 事件探查器中。什么鬼?

请注意,我已经预先生成了我的 Entity Framework View ,并且我尝试使用编译查询来排除 EF“预热”时间。没有区别。

我很感激任何帮助解决这个问题。提前致谢。

最佳答案

我理解响应告诉我要对数据进行批处理,而不是加载整个实体等;总的来说,我同意这种做法。但是,在这种情况下,我们选择单个实体——因为它来自规范化数据库,涉及跨多个表的连接。

在这个确切的例子中,EF 生成的可怕查询仍然在 0.2 秒内执行。如果我愿意手写查询,它可能会再次花费 1/10。事实上,它绝对足够快。线上整个实体的大小<6Kb;同样,我认为它足够小。

所以对于我来说,跨多个请求批处理这个单个实体,在这个例子中根本行不通。显然,如果我直接使用 ADO.NET 和 Web 服务/WCF,我就不会遇到这个问题。无论如何,关于答案:

我已经说过编译 EF 查询没有帮助。但是,这似乎可能是因为 RIA 服务在我的原始查询之上应用了“Where EntityID = ID”条件,并破坏了我编译的查询。

如果我只是在我的域服务中这样做:

(from e in ctx.Entities
.Include("SubEntity")
.Include("SubEntity.SubEntity")
// and so on, X20...
where e.EntityID == id
select e).FirstOrDefault();

这行代码几乎占用了整个执行时间,但SQL非常快。进入 SQL Server 的速度很慢。所以这对我来说意味着 EF 需要很长时间才能生成查询。

为了解决这个问题,我做了一个预编译查询,直接通过 ID 选择我的实体,并将它具体化而不是返回 IQueryable:

 private static Func<DataContext, Guid, Entity> getEntityByEntityID =
CompiledQuery.Compile<DataContext, Guid, Entity>(
(ctx, id) => (from e in ctx.Entities
.Include("SubEntity")
.Include("SubEntity.SubEntity")
// and so on, X20...
where e.EntityID == id
select e).FirstOrDefault());

然后我在我的域服务上公开一个新操作以使用已编译的查询:

public Entity GetEntityByEntityID(Guid entityID)
{
return getEntityByEntityID(this.ObjectContext, entityID);
}

结果:现在第一次调用时有点慢。对于后续调用,整个服务调用的操作现在平均在 0.5 秒左右。

关于silverlight - WCF RIA 服务查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7476792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com