Linq to Entities 性能和预生成视图

2023-12-03

我们在首次运行 linq to EF 查询时花费了很长时间。我很惊讶地发现预生成视图后没有任何差异。我遇到了以下声明堆栈溢出

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

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

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

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

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

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

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

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

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


我认为您找到的答案不正确。您可以将 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 的预生成视图(我是作为 EF6 的作者这样说的)用于生成视图的 T4 模板对于 EF5 和 EF6 以及EF6 的交互式视图)。然而,我们发现对于 EF6 中的 Code First 应用程序,实际瓶颈在于构建模型。还有一些其他性能问题 - 请参阅这篇博文更多细节。许多此类问题已在 EF6.0.2 中得到修复,因此如果您尚未升级到 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 无关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linq to Entities 性能和预生成视图 的相关文章

随机推荐

  • MVC4 Windows 身份验证重定向到帐户/登录

    我正在设置Windows 身份验证在 MVC 4 应用程序中使用视觉工作室2013并使用IIS Express 开发服务器 但是 我被重定向到 Account Login 就好像我正在使用表单身份验证一样 我的 bin 文件夹 或任何地方
  • 在 RECEIVE_BOOT_COMPLETED 上通过广播接收器访问数据库

    当手机完成启动后 我想根据数据库中的小时 分钟 信息自动重新注册一些警报 我尝试使用广播接收器来执行此操作 但它不起作用 当尝试在启动时访问数据库 DB 帮助程序类时 它会崩溃 通过应用程序访问数据库帮助程序类时 它工作正常 这是可能的还是
  • boost::spirit::karma 输出引号内的字符串

    我正在尝试使用 boost spirit karma 转义引号中的字符串 如果它只是一个字符串 则效果很好 但是 对于 std vector 中 boost variant 中的字符串 则不然 只是打印字符串确实有效 但是我不太明白为什么
  • 字符串有隐藏字符,无法验证,

    大约2小时前我问了一个问题 不需要看问题 只是一个参考 使用node js存储图像出现错误 给出的解决方案实际上与我的代码相同 我试图找到我的代码和他的代码之间的差异 看看他做了什么修改才能使其工作 但没有任何修改 所以我想到尝试一下在线I
  • 既然“invoke”已被软弃用,那么替代方案是什么?

    rlang invoke 现已软弃用 purrr invoke 退休了 如今 以编程方式调用带有参数列表的函数的简洁方法是什么 tldr Use exec代替invoke use map2 plus exec代替invoke map 示例i
  • UIImagePickerController 如何隐藏翻转相机按钮?

    有没有办法隐藏 UIImagePickerController 内的翻转相机按钮 谢谢阅读 我最终使用 UIImagePickerController 的自定义子类来解决此 和其他 问题 import SMImagePickerContro
  • 将包含十六进制值的字节数组转换为十进制值

    我正在 c 中进行应用程序 这里我想将包含十六进制值的字节数组转换为十进制值 假设我有一个字节数组为 array 0 0X4E array 1 0X5E array 2 0X75 array 3 0X49 在这里 我想将该十六进制数组转换为
  • random_state在train_test_split和分类器中的作用

    基于这个答案 Scikit learn 中的随机状态 伪随机数 如果我使用相同的整数 比如 42 random state 然后每次进行训练 测试分割时 它应该给出相同的分割 即每次运行期间训练中的数据实例相同 测试时的数据实例相同 But
  • XSLT根据父子元素的值删除子元素

    我正在尝试使用这里使用的一些相同的逻辑https stackoverflow com a 10629806 662877 到不同的 XML 但没有得到预期的输出 如果 TERR KHM6 则删除 剥离这两个元素创建付款项目 and 创建支付
  • 一java内存刷新易失性:一个好的程序设计?

    这是与此相关的问题 java 在一个变量上使用 易失性 VS 每个变量 我有一个或多个不同的对象 我想改变其中的某些状态 然后我想让该状态对其他线程可见 出于性能原因 我不想使该对象中的每个成员变量都是易失性的 有时我想在单线程应用程序中使
  • Spring REST 服务:从请求中检索 JSON

    我正在 Spring 3 1 上构建 REST 服务 我正在使用 EnableWebMVC 注释 由于我的服务仅接受 JSON 请求 因此我还想将传入请求转储到 MongoDB 集合中以进行日志记录 以及稍后的数据转换 我想访问原始 JSO
  • 将 Cassandra OrderedMapSerializedKey 转换为 Python 字典

    我在 Cassandra 中有一列由列表映射组成 当使用 Python 驱动程序查询时 它返回一个 OrderedMapSerializedKey 结构 该结构是列表的映射 我想将整个查询放入 pandas 中 要从 OrderedMapS
  • 是在webview已经获取文件之后调用setDownloadListener onDownloadStart吗?

    WebView 是否会执行 Http Get 并下载完整文件 然后调用我的 onDownloadStart 方法 并且我的代码再次下载文件 在 Android 应用程序中使用的 WebView 中 我们需要处理 PDF 文件的下载 我看到的
  • 无法使用特殊主体“sa”

    当我尝试运行命令时 EXEC master sp addsrvrolemember loginame N sa rolename N serveradmin GO 我收到错误 消息 15405 级别 11 状态 1 过程 sp addsrv
  • 更改 WPF 中的按钮内容

    I have private void button1 MouseEnter object sender EventArgs e for int i 0 i gt 2 i button1 Content Convert ToString i
  • 如何在ngrx效果中进行http轮询

    我有这种效果 我尝试使用计时器每 x 秒轮询一次数据 但我无法弄清楚计时器应该如何与数据流交互 我尝试在顶部添加另一个 switchMap 但随后我无法将操作和有效负载传递给第二个 switchmap 有任何想法吗 我在看这个帖子但我的情况
  • Spring MVC 3 中的 MarshallingView

    当我使用 MarshallingView 封送我的 FileManagement 对象列表 java util List 时 出现此错误 如果我只向模型添加一个对象 则不会发生这种情况 所以它使用的是对象 而不是集合 List 例外 jav
  • Javascript 中的日期差异(忽略一天中的时间)

    我正在编写一个设备租赁应用程序 其中根据租赁期限 以天为单位 向客户收取租赁设备的费用 所以 基本上 每日费用 天数 总费用 为了获得客户端的即时反馈 我尝试使用 Javascript 来找出两个日历日期的差异 我四处寻找 但没有发现任何东
  • 为什么以下代码中出现分段错误?

    我在维基百科上读到了这个 int main void char s hello world s H 当包含此代码的程序被编译时 字符串 hello world 被放置在程序可执行文件中标记为只读的部分中 加载后 操作系统将其与其他字符串和常
  • Linq to Entities 性能和预生成视图

    我们在首次运行 linq to EF 查询时花费了很长时间 我很惊讶地发现预生成视图后没有任何差异 我遇到了以下声明堆栈溢出 视图生成仅对 标准 查询有帮助 例如 当您调用 someObject RelatedEnd Load 或 MyCo