C# 实体框架6-GetExecutionPlan性能命中

C# 实体框架6-GetExecutionPlan性能命中,c#,sql-server,performance,entity-framework,query-optimization,C#,Sql Server,Performance,Entity Framework,Query Optimization,我正在使用Entity Framework 6执行一个非常复杂的查询,整个查询构建在DbContext提供的标准IQueryable接口上 尽管生成的查询非常复杂,但它在我的数据库服务器上执行只需几毫秒。所有执行的连接都是合理的,似乎都使用了正确的索引 但是,当我使用dotTrace分析应用程序时,我发现Entity Framework在准备执行计划(System.Data.Entity.Core.Objects.elink.elinkQueryState.GetExecutionPlan)时,

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

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

但是,当我使用dotTrace分析应用程序时,我发现Entity Framework在准备执行计划(
System.Data.Entity.Core.Objects.elink.elinkQueryState.GetExecutionPlan
)时,大约需要1-2秒的时间

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

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

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


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

谢谢你的回答,杰夫。这当然是我的选择之一。然而,这基本上意味着放弃LINQ,使用实体框架来解析结果。我动态添加了此查询的许多部分(动态筛选、分组和排序),因此首先我想看看是否有优化现有解决方案的选项,而不是在T-SQL中全部重写。是否使用GroupJoin?嗨,Tom,你解决了吗?@kemsky我在SQL中重写了这一部分,因为性能对我们很重要。