【问题标题】:Optimize EF Core query with Include()使用 Include() 优化 EF Core 查询
【发布时间】:2018-09-07 20:52:21
【问题描述】:

我的项目中有以下查询,执行起来很费时间。我正在尝试优化它,但无法成功。任何建议将不胜感激。

_context.MainTable
.Include(mt => mt.ChildTable1)
.Include(mt => mt.ChildTable1.ChildTable2)
.Include(mt => mt.ChildTable3)
.Include(mt => mt.ChildTable3.ChildTable4)
.SingleOrDefault(
        mt =>
        mt.ChildTable3.ChildTable4.Id == id 
        &&
        mt.ChildTable1.Operation == operation
        && 
        mt.ChildTable1.Method = method
        && 
        mt.StatusId == statusId);

【问题讨论】:

  • 您是否需要 MainTable、ChildTable1、ChildTable2、ChildTable3 和 ChildTable4 中的每一列,或者您能否缩小结果集中所需的数据列?
  • 在此处查看有关显式加载的部分:docs.microsoft.com/en-us/ef/core/querying/related-data 包含过多会导致查询不佳。两种显式加载技术中的任何一种都可以更有效。

标签: entity-framework optimization entity-framework-core


【解决方案1】:

Include() 被转换为加入,而您在代码中使用了太多的加入。您可以借助数据库引擎执行计划来优化索引。

我建议你不要一次性使用所有Include。相反,您打破查询并一一应用Include。我的意思是你申请Include, get the result and then apply theIncludeagain and so..By having more than twoInclude`会影响性能。

【讨论】:

  • 是的,事实证明 Include() 是罪魁祸首。我从查询中删除了所有 Include() 并使用了传统的 Join()。我的表现有了显着的提高。具有多个 Include() 的原始查询过去需要 1-1.5 分钟才能执行。在我们用 Join() 修改它之后,它现在在 2-3 秒内执行。看起来虽然 Include 语句在后台生成 Joins,但它生成连接逻辑的方式很复杂,并且会导致性能问题。感谢您的意见。
【解决方案2】:

我没有发现您的查询有任何性能问题。

因为你有一个 singleOrDefault 我会考虑优化数据库调用。如果您在 SQL Server Management Studio 中有可用的分析工具,则选择工具 > Sql Server Profiler。在 SQL Server Management Studio 中获取查询,标记查询并选择“在数据库引擎优化顾问中分析查询”

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 2022-01-14
    • 2020-08-24
    • 2021-01-30
    • 1970-01-01
    • 2021-12-12
    • 2021-09-06
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多