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

摘要:
下面主要介绍其中的一个方法—-批量添加BulkInsert。在VS中新建EF之后,右键解决方案下的引用,选择管理NuGet程序包,搜索Z.EntityFramework.Extensions并安装。那为什么图片中有多条Insert语句呢,当你使用BulkInsert时,如果数据达到4万之前,那在SQL的解释时,也是很有压力的,有多情况下会超时,当然这与你的数据库服务器有关,但为了性能与安全,将Bulk操作变为分批提交,即将上W的数据进行分解,分用1W数据量提交一次,这样,对数据库的压力就小一些。

之前做项目的时候,做出来的系统的性能不太好,在框架中使用了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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇078_&amp;lt;laber&amp;gt;标签有什么作用?关于发邮件报错535 Error:authentication failed&amp;amp;553 authentication is required下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java学习笔记hibernate基础(1)

hibernate基础1.hibernate介绍与动手入门体验  问题:模型不匹配(java对象模型与数据库关系模型不匹配)  解决: 1.使用JDBC手工转换        2.使用ORM(Object Relation Mapping对象关系映射)框架,有Hibernate,TopLink,OJB  下载地址http://www.hibernate.o...

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署

这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第五篇:MVC程序中实体框架的Code First迁移和部署 原文:Code First Migrations and Deployment with the Entity F...

Oracle 表空间

表空间(table space)是Oracle数据库中最大的逻辑结构。从逻辑上说,Oracle数据库是由若干个表空间组成的。表空间与数据库的物理结构有着十分密切的关系,它与磁盘上若干个数据文件相对应。从物理上说数据库的数据被存放在数据文件中,从逻辑上说数据是被存放在表空间中。 表空间是个重要的概念,因为它提供了一套有效组织数据的方法。数据库的逻辑配置实际上...

PowerDesiGner数据库设计

原文地址:http://hi.baidu.com/shunkunl/blog/item/871c75ef8596faeace1b3e00.html PowerDesign:PowerDesign是 Sybase推出的主打数据库设计工具。PowerDesign致力于采用基于Entiry-Relation的数据模型,分别从概念数据模型 (Conceptual...

PHP-数据库操作

连接数据库 PHP操作数据库的方式有多种如 mysql 、mysqli、PDO,目前主要使用的是PDO处理。 PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 下面是使用 PDO 连接数据库的操作,当连接失败时将抛出异常。 <?php header('Content-type:text/ht...

oracle的热备份和冷备份

一、冷备份介绍:    冷备份数据库是将数据库关闭之后备份所有的关键性文件包括数据文件、控制文件、联机REDO LOG文件,将其拷贝到另外的位置。此外冷备份也可以包含对参数文件和口令文件的备份,但是这两种备份是可以根据需要进行选择的。,冷备份实际也是一种物理备份,是一个备份数据库物理文件的过程。因为冷备份要备份除了重做日志以外的所有数据库文件,因此也被成为...