【问题标题】:Entity framework performance tuning实体框架性能调优
【发布时间】:2017-03-19 10:48:52
【问题描述】:

我们正在使用实体框架来查询 SQL 服务器数据库。 LINQ 表达式是 IQueryable。此查询大约需要 10 秒才能执行。如果这是在存储过程中,我会使用查询来提高效率。但是,如果我使用 IQueryable,实体框架本身是否决定如何构建有效的查询,或者我是否必须使用 linq 表达式并通过反复试验来提高性能?

【问题讨论】:

  • 最好包含实际查询,这样的抽象问题通常对未来的读者没有帮助。

标签: sql-server entity-framework-5


【解决方案1】:

作为一名数据库开发人员而不是 C# 开发人员,并且对实体框架细节的了解非常有限,我可以说:

我的理解是Entity Framework决定如何构建查询,可能没有太多理解效率的能力。在您的 Linq 查询或 Lambda 表达式中,您可能会有一些事情做得更好或更糟,但在大多数情况下,您可能无法真正调整查询。这是使用 ORM 的主要缺点,至少从 DBA 的角度来看,他们在半夜当服务器爬到停止状态时被分页,他们无法做任何事情来修复查询,这不像你总是可以只添加一个索引;-)。

我还可以说,您确实可以在实体框架中为每个 DML 操作指定一个存储过程,这样如果您真的需要对这个特定查询做一些更好的事情,那么就为此创建一个存储过程一个操作并将 EF 对象指向它以进行 SELECT,但允许 EF 为 INSERT / UPDATE DELETE 构建查询。

这有帮助吗?

【讨论】:

    【解决方案2】:

    实体框架本身是否决定如何构建有效的查询

    EF 将始终自动确定如何构建查询,并且 sql -server 也会自动优化查询。

    我是否必须使用 linq 表达式并通过反复试验来提高性能?

    您可以尝试使用查询,但通常较小的更改不会影响性能(就表达式的顺序而言)

    您始终可以使用SQL Profiler 来观察 EF 的作用并了解查询的效率。如果需要很长时间,您可以在 SSMS 中重新运行查询并打开 Include Actual Execution Plan 并确定查询慢的地方。

    【讨论】:

      【解决方案3】:

      如果您使用的是 EF 6,则可以非常轻松地启用日志记录。然后,您可以检查每个呼叫在做什么。我会从那里开始。 MSDN EF6 Logging

      您能否分享更多有关您的查询和结果大小的信息?

      【讨论】:

      • 我已经能够在 SQL 分析器中看到查询。我想问的是有没有办法调整 linq 表达式以获得最佳性能。
      • @developer747,有时您可以将复杂查询拆分为较小的查询,这会改变整体执行时间。但是您需要共享查询以便更好地帮助您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多