添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

之前做项目的时候,做出来的系统的性能不太好,在框架中使用了EntityFramework,于是就在网上查资料,研究如何提高EF的性能。
在这分享一篇博客 批量操作提升EntityFramework的性能
里面提供了一个扩展库 Entity Framework扩展库 ,在这里面找到了一些比较好的方法。下面主要介绍其中的一个方法—-批量添加BulkInsert。

这些扩展方法在哪里找?

在VS中新建EF之后,右键解决方案下的 引用 , 选择 管理NuGet程序包 ,搜索 Z.EntityFramework.Extensions 并安装。

然后在类里面添加引用之后就可以直接点出来。

批量添加和EF本身自带的添加性能提高了多少?

下面咱们就用实例说话:
构造一个10W个studentinfo实例:

            '''定义要添加数据的条数'''
            int customerCount = 100000;
            '''定义一个实体集合'''
            List<studentInfo> customers = new List<studentInfo>();
            '''想集合中添加数据'''
            for (int i = 0; i < customerCount; i++)
                studentInfo customer = new studentInfo()
                    name = "2" + i,
                    sex = "2" + i,
                    studentID = "2" + i,
                    age = "2"
                customers.Add(customer);
                Console.Write(".");

用EF自带的添加方法将数据添加到数据库中,为了计算使用时间,加上StopWatch:

'''开始计时'''
Stopwatch watch = Stopwatch.StartNew();
using (EFTestEntities dbcontext = new EFTestEntities())
                foreach (var entity in customers)
                    dbcontext.studentInfoes.Add(entity);
                dbcontext.SaveChanges();
'''计时结束'''
watch.Stop();
'''输出时间'''
Console.WriteLine(string.Format("{0} customers are created, cost {1} milliseconds.", customerCount, watch.ElapsedMilliseconds));

好了现在运行,等待中……
哎~~实在是没有耐心等待它运行完。
怎么办,减少数据量,先添加1000条:

还好,用时6157毫秒,6.157秒;

接着走,把数据量改为10000条:

运行完了,共117096毫秒,117.096秒,将近两分钟。实在是没有耐心再测100000条的了,接下来直接测批量添加的方法。

将上面的添加到数据库中的代码换成下面的代码:

dbcontext.BulkInsert(customers);
dbcontext.BulkSaveChanges();

直接上10W条:

运行完了,共3592毫秒,3.592秒,真快啊~~

那么20W呢?

20W条数据运行完,才花了6346毫秒,6.346秒的时间。比上面的方法添加1000条的数据用的时间差不多,看来EF自带的添加方法慢,是毋庸置疑的了。

为什么扩展方法用的时间这么少?

EF自带的方法,会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发到数据库端,然后去提交,下面的图片是我用SQL Server Profiler记录的和数据库交互的操作,这只是一小部分,试想,如果你的数据量达到万级别(更不用说百万,千万数据了),那对数据库的压力是很大的

而扩展方法运行时与数据库的交互是这样的:

批量添加的方法是生成一条SQL语句,和数据库只交互一次。那为什么图片中有多条Insert语句呢,当你使用BulkInsert时,如果数据达到4万之前,那在SQL的解释时,也是很有压力的,有多情况下会超时,当然这与你的数据库服务器有关,但为了性能与安全,将Bulk操作变为分批提交,即将上W的数据进行分解,分用1W数据量提交一次,这样,对数据库的压力就小一些。

源代码下载:EF扩展方法BulkInsert(批量添加)

  • 参考博客链接
    1. EF架构~数据分批批量提交
    2. EntityFramework 中支持 BulkInsert 扩展
    3. 批量操作可显著提升Entity Framework的性能
    4. .NET Entity Framework Extensions
    5. Flink SQL 在美团实时数仓中的增强与实践
      美团数据系统研发工程师董剑辉&美团数据系统研发工程师张彬,在 Flink Forward Asia 2022 平台建设专场的分享。
      面向异构数据的Schema-on-Read分析技术设计与实践
      本文是12月4号在《DataFunTalk技术交流会:阿里云实时查询分析专场》分享的议题《面向异构数据的Schema-on-Read分析技术与实践》的文字版记录。一、背景介绍数字化转型浪潮中,物理世界到数字世界的映射带来了各种各样结构的数据。第一种是完全无结构的数据,完全没有任何规律,典型的如syslog这种记录系统事件的日志;第二种是半结构化数据,有局部的结构,但是不同的行的字段的数目是不确定的
      18853 分布式全局唯一ID (学习总结---从入门到深化)
      日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如 用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订 单 ID 对应且仅对应一个订单。
      大数据学习记录---JAVA篇---后续知识
      一些面向对象之后的知识的学习,包括下面知识:1、包装类 2、正则表达式 3、Array类 4、Lambda表达式 5、collection集合 --List系列和Set系列 6、 map集合--重点hashmap 7、泛型修饰 8、可变参数 其实一种常见API的知识,也不太需要死记硬背,要学会查api文档去看里面具体每个方法是怎么用的,在后续使用中去学去熟悉。
      1. openGauss AI框架的特点 DB4AI这个方向中,数据库通过集成AI能力,在用户进行AI计算时就可以避免数据搬运的问题。不同于其他的DB4AI框架,本次openGauss开源的原生框架是通过添加AI算子的方式完成数据库中的AI计算。 那么除了避免了数据搬运所带来的问题这个普遍优势,openGauss的AI框架还具有以下的优势和特点: 1)极低的学习门槛 当前最主流的计算框架:Tensorflow、pytorch、keras等大多依托于python语言作为构建的脚本语言,虽然python已经足够的简单易学但还是需要一定的学习成本。而当前的框架,设计提供了CREATE MOD
      图解大数据 | 基于Dataframe / SQL大数据处理分析@Spark操作
      DataFrame是一个以命名列方式组织的分布式数据集。本文详细讲解 Spark Dataframe的创建方式,Dataframe数据的Agg、Collect、Groupby、Join等核心操作,以及Spark SQL操作核心要点。
  •