为什么 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 工作这么慢? 的相关文章

  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 实体框架:从模型生成数据库从模型存储中删除存储过程

    我正在使用带有 EF 4 模型的存储过程 为了实现这一目标 我将执行以下步骤 我通过从数据库更新并选择它来将存储过程添加到我的模型存储中 添加了函数导入以指向存储过程 存储过程返回连接多个表等的查询结果 因此在 返回集合 我指定的区域复合型
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • 限制实体框架中子实体的数量

    底线在前 有没有一种简洁的方法可以限制可以属于实体框架中父级的子实体的数量 我现在使用的是4 3 1 问题 我正在开发一个 ASP NET MVC3 站点 它通过使用实体框架的数据访问层访问数据 我有一个 SearchList 实体 它与搜
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 为什么列表理解在数组相乘方面比 numpy 快得多?

    最近我回答了THIS https stackoverflow com questions 31596979 multiplication between 2 lists 31597029 31597029想要两个列表相乘的问题 一些用户建议
  • 在c#中映射两个类

    我有两节课 public class foo1 public int id public string image link public string sale price and public class foo2 public int
  • 为什么 EF Core 使用此存储过程总是返回 -1?

    我正在尝试对本地 2016 DB 使用 EF Core 最新版本 并且我得到 1每次都回来 我不知道我做错了什么 我知道它正在到达数据库 我查了一下 int returnCode dbContext Database ExecuteSqlC
  • 如何提高包含大量小图像的 UCollectionView 的性能?

    在我的 iOS 应用程序中我有UICollectionView显示大约 1200 个小 35x35 点 图像 图像存储在应用程序包中 我正确地重用了UICollectionViewCell但仍然存在性能问题 具体取决于我处理图像加载的方式
  • 使用实体框架从 2 个表返回数据

    我正在使用 MVC3 和实体框架 但我需要来自不同表的更多数据 通常我会做这样的事情来从表中获取数据 Table Users id username 在代码中我会做这样的事情来获取所有用户 public static IEnumerable
  • 从类型获取 DbSet

    我正在尝试为 MVC 6 应用程序制作通用表查看器 编辑器 我目前使用 Context GetEntityTypes 返回给我一份表格列表 现在我需要获取特定类型的数据 我当前的实现是 On my context public IQuery
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • Swift 使用哪种通用排序算法?它在排序数据上表现不佳

    我一直在挑选和探索 Swift 标准库sort 其函数为Array类型 令我惊讶的是 我注意到它在已经排序的数据上表现不佳 对数组进行排序Int打乱顺序似乎比对已经排序的同一个数组进行排序快 5 倍 对已打乱顺序的对象数组进行排序比对已按排
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 我可以将 MongoDB 与实体框架一起使用吗?

    实体框架有可能支持MongoDB数据库吗 有人写过实体框架MongoDB Provider吗 简短的回答 不 这肯定是可能的 但不合理 MongoDB 是文档数据库 不支持集合之间的任何物理关系 EF 非常适合 SQL MySQL 等关系数
  • 有没有更简单的方法来处理复选框?

    在 vb net 中 我有一个包含一组四个复选框的表单 每个复选框都表示 选中时 用户想要向其订单添加特殊指令 代码如下所示 If SpecialInstruction1CheckBox Checked Then AddSpecialIns
  • TypeScript 编译速度极慢 > 12 秒

    只是把它放在那里看看其他人是否也遇到这个问题 我已经使用 webpack 作为我的构建工具 使用 typescript 构建了一个 Angular 2 应用程序 一切都运行良好 但是我注意到 typescript 编译超级超级慢 我现在只有
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复

随机推荐

  • 空手道: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