为什么 DbSet.Add 工作这么慢?

2024-04-04

8 个月前曾在这里讨论过同样的话题:如何加快 DbSet.Add() 的速度? https://stackoverflow.com/questions/4355474/how-do-i-speed-up-dbset-add。除了使用 SqlBulkCopy 之外,没有提出任何解决方案,这对我们来说是不可接受的。我决定再次提出它,希望围绕这个问题可能有新的想法和想法,并提出其他解决方法。至少我只是好奇为什么这个操作需要这么长时间才能运行。

好吧,问题是:我必须将 30K 实体更新到数据库中(EF 4.1,POCO)。实体类型非常简单,包含整数 Id + 其他 4 个整数属性,与其他类型没有关系。 2 例:

  • 全部都是新纪录。为每个实体逐一运行 context.Entities.Add(entity) 需要 90 秒,且 Cntx.Configuration.AutoDetectChangesEnabled=false(true 值使其永远运行)。然后 SaveChanges 只需一秒钟。其他方法:像这样将其附加到上下文需要相同的 90 秒:

    Cntx.Entities.Attach(entity);
    Cntx.Entry(entity).State = EntityState.Added;
    
  • 所有这些都是现有记录,但有一些变化。在这种情况下,只需几毫秒即可将其附加到现有数据上下文,如下所示:

    Cntx.Entities.Attach(entity);
    Cntx.Entry(entity).State = EntityState.Modified;
    

    看到不同?

Add 方法的幕后原因是什么导致其运行速度如此之慢?


我得到了有趣的性能测试结果,并且找到了罪魁祸首。我在我读过的任何 EF 源中都没有看到过类似的信息。

事实证明,Equals 在基类中被重写了。基类应该包含所有类型的具体实体之间共享的 Id 属性。这种方法被许多 EF 书籍推荐并且广为人知。您可以在这里找到它,例如:如何最好地实现自定义类型的 Equals? https://stackoverflow.com/questions/567642/how-to-best-implement-equals-for-custom-types

更准确地说,拆箱操作(对象到具体类型的转换)会降低性能,导致运行速度如此缓慢。当我评论这行代码时,它需要 3 秒才能运行,而之前需要 90 秒!

public override bool Equals ( object obj )
{
    // This line of code made the code so slow 
    var entityBase = obj as EntityBase;
    ...
}

当我发现它时,我开始思考什么可以替代这个 Equals。第一个想法是为 EntityBase 实现 IEquatable,但它碰巧根本没有运行。所以我最终决定为模型中的每个具体实体类实现 IEquatable。我只有很少的一些,所以这对我来说只是一个小更新。您可以将整个 Equal 操作功能(通常是 2 个对象 ID 比较)放入扩展方法中,以便在具体实体类之间共享,并像这样运行它:Equal((EntityBase)ConcreteEntityClass)。最有趣的是,这个IEquatable将EntitySet.Add速度提高了6倍!

所以我不再有性能问题,相同的代码在不到一秒的时间内运行。我的性能提升了 180 倍!惊人的!

结论:

  1. 运行 EntitySet.Add 的最快方法是为特定实体提供 IEquatable(0.5 秒)
  2. 缺少 IEquatable 会使其运行 3 秒。
  3. 大多数来源推荐的 Equals(object obj) 使其运行 90 秒
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 DbSet.Add 工作这么慢? 的相关文章

  • MVC 下拉列表未映射到模型

    我正在尝试使用 EF codefirst 在 MVC 3 中开发应用程序 当我使用 int 属性和约定来设置外键关系时 例如 public class Patient public int ConsultantId get set 然后 我
  • 如何提高 Field.set 的性能(也许使用 MethodHandles)?

    我正在编写一些调用的代码Field set https docs oracle com en java javase 11 docs api java base java lang reflect Field html set java l
  • 按类型进行弹簧接线比按名称接线要慢很多

    在我的项目中 我试图迁移 Foo foo Foo beanFactory getBean name into Foo foo beanFactory getBean Foo class 好处是显而易见的 类型安全 更少复杂的代码 更少无用的
  • 使用 linq 2 实体检查 where 子句的两个条件

    嗨 我有一个名为 产品 的表 其中包含列 product id prodcut name prodcut price values like 1200 2000 3000 100 prodcut desc category id 1 2 3
  • 实体框架中空值的左连接

    我需要使用实体框架在 C 项目中执行 10 次左连接 我已经检查了至少 10 个不同的页面和 stackoverflow 帖子来了解如何执行此操作 他们都没有工作 我当前的加入如下所示 from tbl1 in context tblNam
  • 我们可以使用什么方法来重塑非常大的数据集?

    当由于非常大的数据计算将花费很长时间并且因此我们不希望它们崩溃时 事先知道要使用哪种重塑方法是很有价值的 Lately methods for reshaping data have been further developed regar
  • 非阻塞方法中的饥饿

    一段时间以来 我一直在阅读有关非阻塞方法的内容 这是一段所谓的无锁计数器的代码 public class CasCounter private SimulatedCAS value public int getValue return va
  • 为什么 Android Eclipse 不断刷新外部文件夹并花费很长时间?

    我只有一部新的 Android 手机 我一直在修补一些基本的应用程序 每当我保存任何内容时 Eclipse 的 Android 插件就会刷新外部文件夹 这让我抓狂 通常我不会介意 但当需要 10 秒才能刷新时 我开始注意到 我已经搜索过 其
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇
  • 磁盘寻道时间测量方法

    我编写了一个脚本来测量 HDD 上的寻道时间 并且其完成方式的微小变化会导致显着不同的时间 第一个周期在磁盘开头的区域内进行跳转 第二个周期选择磁盘上执行查找的随机区域 相同大小 这种方法显然不同 但我不明白为什么它会改变结果 请注意 对于
  • 这个 cProfile 结果告诉我需要修复什么?

    我想提高Python脚本的性能并且一直在使用cProfile生成性能报告 python m cProfile o chrX prof bgchr py args 我打开这个chrX prof使用 Python 的文件pstats并打印出统计
  • 如何使用 Entity Framework Code First 在两个实体之间建立多个一对多关系

    下面是保存关系数据库记录的简单方法 该方法运行得很好 我对一种情况有疑问 在此之前 我需要知道如果数据库复杂性增加 我所采用的方法会遇到什么困难 还有更好 高效但简单的方法吗 一对一 tb student store student det
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 使用实体框架时是否应该使用部分类作为业务层?

    我正在开发一个使用实体框架的项目 使用EF生成的类的部分类作为业务层可以吗 我开始认为这就是 EF 的用途 我尝试使用 DTO 模式 很快意识到我只是创建了一堆映射类 这重复了我的工作 而且还导致更多的维护工作和额外的层 我想使用自我跟踪实
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups

随机推荐

  • 空手道:XML 元素更改为具有空命名空间

    当 xml 消息定义如下时 karate 会向子元素添加空名称空间 空手道功能 Feature test xml Scenario test xml empty namespace def x
  • 任何图像文件格式是否支持负浮点数?

    我正在使用 OpenGL 来实现一些屏幕空间过滤器 出于调试目的 我想保存一堆纹理 以便可以比较各个像素值 问题是这些 16 位浮点纹理具有负值 您知道有哪些支持负值的图像文件格式吗 我怎样才能导出它们 是的 有一些这样的格式 您需要的是使
  • 将中心像素值复制到块中的多数值

    我有一个大小为 9085x10852 的图像像素预测数组 我想在每个像素周围得到一个 10x10 的块 如果中心像素值与块中的多数像素值不同 则用多数值替换中心像素值 谁能帮我吗 我正在挖掘scikit image今天寻找其他东西 如果你深
  • 视觉检漏仪未发现泄漏 VS2013

    无论我如何尝试 我似乎都无法让 VLD 捕获任何内存泄漏 有什么想法吗 这里也是输出的片段 Visual Leak Detector Version 2 4RC2 installed The thread 0x5748 has exited
  • 使用百分比而不是像素会改变 html 5 画布的属性吗?

    我正在练习 javascript 我正在尝试制作一个游戏 我希望画布元素是全屏的 因此我对高度和宽度属性使用了百分比 但是当我这样做时 它的行为与通常不同 当我运行调试代码时 它应该生成一个 50px x 50px 的盒子 但图形看起来比正
  • 错误:仅在包含所有数值变量的数据框上定义,并在大型数据集上使用 ddply

    我正在尝试按月 年 调查 ID 和网格 ID 在一个非常大的数据集 22000 条记录 上计算多个参数 例如 Er Count Mn Count 的总和和平均值 我最初尝试使用此代码来获取总和 dlply Effort All c Er C
  • Restsharp 响应中缺少 Cookie

    我将 Restsharp 用于我正在开发的 WPF 客户端 看来我在 client CookieContainer 中没有收到 cookie 在我成功向我们的服务器进行身份验证后 它始终有 0 个项目 这很奇怪 因为使用 Postman 发
  • 防止热链接 1 个特定 URL,但允许所有其他 URL

    我知道 htaccess 方法可以防止除您自己的域之外的每个站点上的热链接 但如果可能的话 我需要更高级的东西 我想允许访问我的个人服务器和所有其他站点 但仍要指出一些选定的站点并禁止它们进行热链接 我几乎想允许所有并拒绝特定的 IP 或
  • 如何减小 iPhone 应用程序的 .wav 音频文件的大小?

    我有一些循环播放的音乐 wav 文件大小约为 8 兆 我加载这个并循环它 一切都工作正常 直到我添加了另一个 4 meg wav 文件 现在游戏崩溃了 删除附加音频文件修复了崩溃问题 那么如何减小这些 wav 文件的大小呢 我想过在完成 4
  • Google Books API - 未返回图书详细信息

    所以我开始使用Google Books API对于我正在构建的应用程序 我对结果相当满意 但有时我会注意到一种奇怪的行为 即使该书存在于数据库中 某些 ISBN 也不会返回任何书籍详细信息 例如 如果我给出 https www google
  • java android eclipse 未绑定类路径变量

    Eclipse 上的 Unbound Class Path 变量是什么意思 我收到错误 但不知道如何修复它 Eclipse 中 Unbound Classpath 变量的含义是什么 这是一条警告消息 内容是 类路径变量 http help
  • Android:我可以从第 3 方应用程序使用此意图吗?

    我正在使用意图通过 Twitter 客户端发布消息 当手机上没有 Twitter 应用程序时 我想将用户重定向到市场 但异常 ActivityNotFoundException 不起作用 每次 当我没有 Twitter 应用程序时 我都会收
  • 程序中出现奇怪的错误“Ora-01001无效光标”

    昨天我处理了生产过程中的一个奇怪的错误 语句执行失败 if v cursor isopen then close v cursor here was an error end if 经过一番研究后 我发现问题出在打开该游标的子程序中 我通过
  • React 显示 0,而不是使用短路 (&&) 条件组件显示任何内容

    我有以下简单的短路语句 应该显示一个组件或不显示任何内容 profileTypesLoading
  • 条件变量可能未初始化

    我正在编写一个程序 根据 CLI 标志将传入文件子集为一个或两个输出文件 至少它的工作原理如下 use std fs File io Write fn main Would be a CLI flag let write all true
  • 瑞典语字符和 UTF-8

    我在所有页面上都使用 UTF 8 但一些瑞典语字符 和 变得混乱 只是一个带有一些字母的方框 我的数据库设置为 utf8 general ci 但我什至没有连接 所以这并不重要 或者我应该使用另一个字符集 这不是瑞典语网站 都是英文的 但我
  • 如何在 Linux 中创建别名? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 假设我想为 srm 创建一个别名 安全删除 这样每次使用 srm 时 都会运行交互式 rm 命令 例如rm i 需要对必要的配置文件进行此
  • 如果标签有重音,NSXMLParser 不会获取所有标签

    我有一个对数据库进行不同更改的网络服务 当我使用带有 sql 标签的 Web 服务返回行时 如下所示
  • Push 替换数组中的旧值

    也许是因为我工作了一整天 我看不到问题所在 但在下面的代码中 警报仅显示最后添加的值 并且不会将值推送到数组中 window sortControl sortControlPanel div sortControl simpleSortCr
  • 为什么 DbSet.Add 工作这么慢?

    8 个月前曾在这里讨论过同样的话题 如何加快 DbSet Add 的速度 https stackoverflow com questions 4355474 how do i speed up dbset add 除了使用 SqlBulkC