实体框架6 - GetExecutionPlan性能命中

时间:2015-09-01 16:25:03

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

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

即使生成的查询非常复杂,它也会在数据库服务器上以几毫秒的速度执行。所有执行的连接都是合理的,似乎它都使用了正确的索引。

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

performance snapshot

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

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

1 个答案:

答案 0 :(得分:2)

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

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