【问题标题】:Entity Framework 6 - GetExecutionPlan performance hit实体框架 6 - GetExecutionPlan 性能下降
【发布时间】:2015-11-26 23:34:39
【问题描述】:

我正在使用 Entity Framework 6 执行一个非常复杂的查询,整个查询建立在 DbContext 提供的标准 IQueryable<> 接口之上。

尽管生成的查询非常复杂,但它在我的数据库服务器上执行只需几毫秒。所有执行的连接都是合理的,似乎都使用了正确的索引。

但是当我使用 dotTrace 分析应用程序时,我发现仅在 Entity Framework 准备执行计划时花费了大约 1-2 秒 (System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan)。

在这种情况下,实体框架似乎产生了太多的开销。甚至结果查询不会是错误的并且会在数据库服务器上执行错误。它是查询生成本身,这花费了太多时间。在使用任何 ORM 时,我从未遇到过此类问题。

我的问题是:是否有一些优化的可能性?在我为这个用例放弃 EF 之前,我可以尝试一些选项吗?

【问题讨论】:

  • 你在使用 GroupJoins 吗?
  • 嗨,汤姆,你解决了这个问题吗?
  • @kemsky 我用 SQL 重写了这部分,因为性能对我们来说很重要。

标签: c# sql-server performance entity-framework query-optimization


【解决方案1】:

一种可能性(如果可以的话)是将其设为存储过程(可能使用您在执行时传递的输入参数)。存储过程的执行计划在保存时生成并保留;如果发生架构更改,还可以自动重新生成。

在这种情况下,期望在运行时生成如此复杂的执行计划是不现实的。

【讨论】:

  • 感谢您的回答,杰夫。这当然是我的选择之一。但是,这基本上意味着放弃 LINQ 并使用实体框架来解析结果。我动态添加了这个查询的许多部分(动态过滤、分组和排序),所以首先我想看看是否有任何选项可以优化现有解决方案,而不是在 T-SQL 中全部重写。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多