c# - Entity Framework 6 - GetExecutionPlan 性能命中

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

我正在使用 Entity Framework 6 执行一个非常复杂的查询,整个查询基于标准 IQueryable<> 构建DbContext提供的界面.

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

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

performance snapshot

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

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

最佳答案

一种可能性(如果可以的话)是使它成为一个存储过程(可能带有您在执行时传递的输入参数)。存储过程的执行计划在保存时生成并保留;如果架构发生变化,也可以自动重新生成。

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

关于c# - Entity Framework 6 - GetExecutionPlan 性能命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336563/

相关文章:

c# - 在代码隐藏中修改现有 cookie 时,对象引用未设置为实例

SQL Server,如何转置列的数据

sql-server - 给定两个 INT,如何将它们组合成 sql server 中的单个 BIGINT?

c# - 如何将 SQL 查询应用于 C# 数据表/数据集?

c# - 构造匿名类型和嵌套循环的通用列表

c# - Kinect 关节 - 对象引用未设置为对象的实例

mysql - 通过 LEAD/LAG 或递归 CTE 更新?

ASP.NET 多次调用应用程序变量的成本有多大?

performance - 为什么一项行动会产生两项工作?

java - 不同屏幕尺寸上的 Sprite 速度