【问题标题】:Linq to Entities performance and pregenerating viewsLinq to Entities 性能和预生成视图
【发布时间】:2014-02-24 22:48:18
【问题描述】:

我们的 linq to EF 查询的首次运行需要很长时间。在预先生成视图后,我很惊讶地发现没有任何区别。我在stackoverflow

上遇到了以下声明

视图生成仅对“标准”查询有帮助(例如,当您调用 someObject.RelatedEnd.Load() 或 MyContext.SomeSetName() 时。出于显而易见的原因,它对使用 LINQ 或 ESQL 的即席查询没有帮助。使用 CompiledQuery 来优化这些。

当他说“出于显而易见的原因”时,我不得不说,“嗯,对我来说还不是很明显”。如果我正确理解这一点,他声称 Linq to SQL 查询不受预生成 EF 视图的影响。

我曾认为实体视图是实体和表之间的通用映射,与任何特定查询无关。这是误会了吗?

我可以看到在我们的 Linq to Entities 查询的第一次运行中使用了大量时间,之后的时间大大减少,因此我假设正在为相关实体和表生成视图。如果它不是一个可以在第一次运行时预先生成的 EF 视图,那么它是什么?

所以我的问题分为三个部分:

  1. 是否为每个查询生成 EF 视图,或者它们只是将表与实体相关联,而不管进行的查询如何?

  2. 上述关于预生成 EF 视图对 Linq 到 EF 查询没有影响的说法是否正确?是否必须改用 CompileQueries?

  3. 上面提到的“明显原因”是什么?

注意:我什至不会问,但如果您使用 EF,互联网上有很多建议(包括 msdn)来预生成视图。这是我看到的唯一一个地方,它建议如果您使用 Linq to Entities,那么预生成与您的查询无关。

【问题讨论】:

    标签: entity-framework entity-framework-6


    【解决方案1】:

    我认为您找到的答案不正确。您可以将 EF 视图视为一种抽象数据库的方式,以便 EF 可以在不了解实际数据库的情况下完成其工作。因此,EF 需要通过 EF 查询/更新管道进行的任何查询或修改操作的视图。事实上,任何/所有 EF 查询(无论是 Linq 查询还是 ESQL 查询)都是通过组合实际上是视图的基本查询来构建的。

    回答你的问题:

    • 通常在第一次查询时只生成一次视图
    • 编译查询和视图是正交的 - 我在上面解释了视图,编译查询是关于缓存生成的查询 SQL 以避免再次编译查询。这很有帮助,因为通常在应用程序中使用的一组查询是有限的,因此可以缓存生成的 SQL(请注意,如果将参数传递给查询,这不会影响生成的 SQL,因为它也会被参数化)。从 EF5 开始,缓存会自动发生 (http://blogs.msdn.com/b/efdesign/archive/2011/06/30/auto-compiled-linq-queries-entity-framework-june-2011-ctp.aspx)。

    在 EF6 中,对视图生成进行了许多改进。我想说的是,在绝大多数情况下,您根本不需要使用 EF6 的预生成视图(我是作为 EF5 和 EF6 的 T4 templates for generating views 以及 interactive views for EF6 的作者这么说的)。但是我们发现,对于 EF6 中的 Code First 应用程序,实际瓶颈在于构建模型。还有一些其他性能问题 - 请参阅this blog post 了解更多详细信息。 EF6.0.2 中修复了很多这些问题,因此如果您尚未升级到 EF6.0.2,则应该升级。我认为 EF 6.1 中还有更多与性能相关的修复。

    旁注: 注意他说的是LINQ or ESQL 而不是Linq to SQL。 ESQL 是 EF 支持的类似 SQL 的查询语言 - 如果您有兴趣,可以阅读更多 here。由于 EF 对 LINQ 有很好的支持,因此实际上并没有很多场景需要使用 ESQL 而不是 Linq to Entities。 Linq to SQL 与 EF/ESQL/Linq to Entities 无关。

    【讨论】:

    • 这对我来说非常热门,因为我将 TPH 继承用于由复杂类型属性组成的子类。子类的预生成视图对初始加载时间没有影响,初始加载时间可以是 40 秒。连续加载需要 0.5 秒。我正在使用 EF5。是的,我正在考虑升级到 EF6,但我担心现在 EF6 运行时本身需要在首次运行时进行 Jitting。
    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多