EF大数据批量处理----BulkInsert

  • 这些扩展方法在哪里找
  • 批量添加和EF本身自带的添加性能提高了多少
  • 为什么扩展方法用的时间这么少


之前做项目的时候,做出来的系统的性能不太好,在框架中使用了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(批量添加)

时间: 2024-11-02 23:48:31

EF大数据批量处理----BulkInsert的相关文章

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1:MSSQL SQL语法篇: BULK INSERT      [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]         FROM 'data_file'        [ WITH       (      [ [ , ] BATCHSIZE = batch_size ]      [ [ , ] CHECK_CONSTRAINTS ]      [ [ , ] CODEP

C#:几种数据库的大数据批量插入

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)_C#教程

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

C# 使用SqlBulkCopy类批量复制大数据

特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可以不一致,但名称和数据类型最好要保存一致.不一致时候,也能进行正确的转换,除了比如DataTime数据类型,不能插入一个无效的string时间字符串. 本文转载:http://zhoufoxcn.blog.51cto.com/792419/166052 参考http://www.cnblogs.co

大数据-ajax异步请求数据问题。。。看不出哪里错了。。。跪求大神指点。。。

问题描述 ajax异步请求数据问题...看不出哪里错了...跪求大神指点... 我做ajax读取Excel表格里的数据...这是JAVA代码 java: public static List<HashMap<Object,Object>> readExcel(String excelPath){ //声明一个集合用于存储解析出来的数据 List<HashMap<Object,Object>> maps = new ArrayList<HashMap&l

2013年大数据真谛:实时分析与批量处理

本文讲的是2013年大数据真谛:实时分析与批量处理,全球经济环境的不景气直接影响了IT系统建设的资金投放.不过,Gartner认为"major retardants to IT growth will lift".随着全球经济正在更大范围内复苏,2013年会出现增量.其中,IT支出将达到3.7万亿,较2012年将增长4.2%.这比之前所预测的3.8%还有增加,由此可见其乐观态度.此外,全球软件支出预计降到2960亿美元,增加6.4%;热点技术如安全.存储管理.客户关系管理等将驱动更高的

.NET批量大数据插入性能分析及比较

原文:.NET批量大数据插入性能分析及比较   数据插入使用了以下几种方式 1. 逐条数据插入2. 拼接sql语句批量插入3. 拼接sql语句并使用Transaction4. 拼接sql语句并使用SqlTransaction5. 使用DataAdapter6. 使用TransactionScope及SqlBulkCopy7. 使用表值参数   数据库使用SQL Server,脚本如下   create table TestTable(Id int ,Name nvarchar(20))   程序

.Net中EF针对大数据量查询超时的一种优化

旧代码: --receiptIds   id集合,每次查1000左右 var mappingList = new List<FinanceSettlementMapping>(); mappingList.AddRange(SettlementMappingRepository.Entities.Include(o => o.ReceiptsTo).Include(d => d.FinanceSettlement).Where(d => receiptIds.Contains

EntityFramework指量添加大数据如何处理性能问题

做一个批量发消息的功能,要向消息表中批量写入数据,用的是微软的EF框架的插入方法:发现就10000条数据就耗时好几分钟,对应追求用户体验的我来说这是极不能容忍的,后来改为拼接SQL,性能提高了好几倍:现在来分享一下经验: 原始的方法类似这种: public ActionResult Add(ItemDetails entity)         {             var sw = new Stopwatch();             sw.Start();