关于EF中批量添加的个人探索
实际的测试代码和数据记录,还有最终的总结都在下面:
/// <summary>/// 这种做法,不用了说了,每次遍历都会打开一次db链接,然后执行insert操作;/// </summary>static void CreateBluckInsertData0(){using (var context = new SiteDbContext()){List<Role> list = new List<Role>();var count = 1000;for (int i = 0; i < count; i++){var entity = new Role(){RoleName = "普通员工" + i};context.Roles.Add(entity);context.SaveChanges();}}}/// <summary>/// 初看,觉得,这样做( context.SaveChanges()方在for循环外面)挺好的,/// 实际跟踪slq发现,还是执行了1000的插入操作,只不过没有在for循环里面;/// 而是在我们的for循环外;总结:不可取;/// </summary>static void CreateBluckInsertData1(){using (var context = new SiteDbContext()){List<Role> list = new List<Role>();var count = 1000;for (int i = 0; i < count; i++){var entity = new Role(){RoleName = "普通员工" + i};context.Roles.Add(entity);}context.SaveChanges();//会增加与数据库的交互次数//EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发到数据库端,然后去提交 }}/// <summary>/// 拼接字符串;组装后一次性操作;确定,传递的字符数量就会很多;网络压力增加;但不管怎样都比上面两张好;/// </summary>static void CreateBluckInsertData2(){Stopwatch watch = Stopwatch.StartNew();var count = 92000;using (var context = new SiteDbContext()){var bluckString = new StringBuilder();for (int i = 0; i < count; i++){bluckString.Append("INSERT INTO ROLES(RoleName) VALUES('");bluckString.Append("WORKER");bluckString.Append(i);bluckString.Append("');");}var result = bluckString.ToString();Console.WriteLine(string.Format("拼接字符串花费的时间:{0} milliseconds.",watch.ElapsedMilliseconds));//然后这里再来一次性批量的进行插入操作; watch.Restart();context.Database.ExecuteSqlCommand(result);//这样做的好处就是,可以一次性,全部插入,缺点就是;发送大量的insert 文本信息;//1000 customers are created, cost 1777 milliseconds.//5000 customers are created, cost 1906 milliseconds.//9000 customers are created, cost 2354 milliseconds.//9000 customers are created, cost 2023 milliseconds.//这样的计算比较草率; }watch.Stop();Console.WriteLine(string.Format("{0} customers are created, cost {1} milliseconds.", count.ToString(), watch.ElapsedMilliseconds));//结果:拼接字符串花费的时间:97 milliseconds.//12000 customers are created, cost 2028 milliseconds.//拼接字符串花费的时间:99 milliseconds.//22000 customers are created, cost 2336 milliseconds.//拼接字符串花费的时间:118 milliseconds.//92000 customers are created, cost 6553 milliseconds. }/// <summary>/// 这里我们使用第三种方法;/// 网上提供的插件的方法;/// 你以为,插件的方法,就是单纯的封装上面的操作?太年轻了,俺都没监测到一条insert 语句;那么它是怎么做的呢?/// /// </summary>static void CreateBluckInsertData3(){Stopwatch watch = Stopwatch.StartNew();var count = 92000;using (var context = new SiteDbContext()){List<Role> list = new List<Role>();for (int i = 0; i < count; i++){var entity = new Role(){RoleName = "普通员工" + i};list.Add(entity);//context.Roles.Add(entity); //fuck stupid; }Console.WriteLine(string.Format("拼接对象花费的时间:{0} milliseconds.", watch.ElapsedMilliseconds));//然后这里再来一次性批量的进行插入操作; watch.Restart();context.BulkInsert(list);context.BulkSaveChanges();}watch.Stop();Console.WriteLine(string.Format("{0} customers are created, cost {1} milliseconds.", count.ToString(), watch.ElapsedMilliseconds));//1000 customers are created, cost 2865 milliseconds//5000 customers are created, cost 18207 milliseconds.//9000 customers are created, cost 51134 milliseconds. (发现是方法用错了,窝草).不要把 context.Roles.Add(entity); 添加在for循环中;//然后结果是这样的:9000 customers are created, cost 2320 milliseconds.//效率明显比上面的方法提高了很多;//由此可见,我们的批量,效果操作,并不由之前那种方法高呢;//拼接对象花费的时间:102 milliseconds.//12000 customers are created, cost 2238 milliseconds.//拼接对象花费的时间:101 milliseconds. //22000 customers are created, cost 2258 milliseconds.///拼接对象花费的时间:123 milliseconds.// 92000 customers are created, cost 3054 milliseconds.//这种方式的优势就不断体现出来了;//总结,凭借,字段串额效果,要比拼接对象集合的效率要高一些;//然后,就是我们的 }//可能涉及到一些批量数据迁移的时候;///总结:public void Info(){//凭借字段串的效率比拼接对象List的效率要高一些;//方式2的缺点在于,要传送大量的sql语句到我们的db中去执行,//方式3的实现方式和方式一有着本质的区别;是通过;//是数据小于五万条的时候,方式2的效率高,随着数据量的增加;方式3的优势就体现出来了//如果实际的开发中遇到大数据的批量操作;建议还是是用插件方式,就是我们的的方式3;//ps 操作中犯了一个错,是list.add(entity) 而不是 context.Roles.Add(entity); //fuck stupid; }static void Main(string[] args){HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();//CreateBluckInsertData1();//CreateDB();//CreateBluckInsertData3();// CreateBluckInsertData2(); Console.ReadLine();}
当然,这里还有我们的另外一种做法;
SqlBulkCopy 接口描述
Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。 SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案
似乎这种效率更高一些(不过,俺没有去测)
阅读资料后,发现,z的扩展插件使用的就是我们的sqlbulkcopy接口滴呀;
大致的流程如下:
- 在SQL Server中创建一张临时表;
- 使用.NET SqlBulkCopy将数据批量插入临时表;
- 在临时表和目标表之间执行一条SQL语句;
- 从SQL Server删除临时表。
参考文献:
http://www.cnblogs.com/gaochundong/p/entity_framework_bulk_insert_extension.html
这里有一偏使用心得:
https://www.cnblogs.com/mobydick/archive/2011/08/28/2155983.html
还有这个:
https://www.cnblogs.com/zfanlong1314/archive/2013/02/05/2892998.html
转载于:https://www.cnblogs.com/mc67/p/8011432.html
关于EF中批量添加的个人探索相关推荐
- python 批量增加文件前缀_linux中批量添加文件前缀的操作方法
linux中批量添加文件前缀的操作方法 需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件"xxx.txt"变成"gt_xxx ...
- linux在目录前加前缀,linux中批量添加文件前缀的操作方法
需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件"xxx.txt"变成"gt_xxx.txt": 网上搜来的脚本如 ...
- linux批量在文件名前面加前缀,linux中批量添加文件前缀的操作
linux中批量添加文件前缀的操作 需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件"xxx.txt"变成"gt_xxx.t ...
- Linuxvim 中批量添加注释
vim 中批量添加注释 方法一 :块选择模式 批量注释: Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,按 ...
- Excel中批量添加超链接
[摘要] 工作中经常需要给文件添加超链接,方便进行文档查阅,如果文档过多,一个一个添加超链接很麻烦,这时候批量添加超链接就非常重要了.下面将结合示例告诉大家如何在Excel中进行批量超链接的设置. [ ...
- Bigemap中批量添加第三方在线地图教程
说明:批量添加可以同时添加多个在线地图,一次性添加完成 第一步 : 下载批量添加批处理文件:添加文件 第二步: 查看文件,打开一个txt文件,直接拖进去,如下图: 文件里面,记录了常用的一些地图的浏览 ...
- 利用VBA在excel中批量添加备注
excel表中有4列数据,给第4列添加批注,批注的内容为第4列的数据,如何批量添加呢? 按Alt+f11打开VBA编辑器,加入以下代码 Sub 添加批注() Dim t As String For i ...
- 在Office365中批量添加联系人
在O365中,联系人项没有提供批量导入的选项,需要一个一个添加.需要大批量添加时,无疑是一件很痛苦的事! 实际上,我们可以使用Windows PowerShell和CSV文件批量导入联系人.主要分为以 ...
- 在AD中批量添加多个用户帐号
问题: 如何批量的创建帐号? 解决方案: 在利用CSVDE.EXE或LDIFDE.EXE来批量创建用户帐号 实验环境: Windows 2003 如果我们要想批量的创建帐号的话,我们可以首先利用文字编 ...
最新文章
- Android友盟增量更新
- Nginx-09:Nginx原理
- MYSQL5.7 忘记ROOT密码/初始化ROOT密码
- 在centos6.4 编译64位的hadoop 2.4.1
- go thrift demo
- 美国WH在明尼苏达州最大光伏阵列完工
- java concurrent之前戏synchronized
- SQL Server--疑难杂症之坑爹的Windows故障转移群集
- 涡轮增压扫地机器人_帮着做家务,好坏在哪里,科沃斯T5扫地机器人
- 开源mes系统_如何让iMES系统快速落地变得so easy?
- 数据库切换为mysql中出现的问题:Error loading MySQLdb module.
- 开启人才进阶之旅,鲲鹏开发者技术沙龙点燃计算行业激情
- 研究生新人如何高效读论文-方法积累笔记
- 如何快速更换证件照背景颜色
- 电影院票务管理系统数据库设计
- 『IT视界』 [原创评论]揪出"程序员"身上的"六宗罪"
- andorid 源码北京公交线路查询(离线)
- 幽灵行动:NVIDIA 310M显卡完美超频直逼中高端显卡
- 病毒感染检测(数据结构串,c语言版)
- 大数据开发实习生--------------------入职篇
热门文章
- nginx图片过滤处理模块http_image_filter_module安装配置笔记
- [转载]64位linux安装WPS
- ASP.NET MVC 3中ViewBag, ViewData和 TempData
- 沉甸甸的证书,沉甸甸的心情
- 小型星形网络结构设计示例
- 塞尔达传说顺序_编码《塞尔达传说》克隆图例
- unity开发入门_Unity游戏开发终极入门指南
- 构建node.js基础镜像_我如何使用Node.js构建工作抓取网络应用
- 公司成立两周年感言_对我的副项目成立一周年的一些反思
- 从新手到入门,如何进入协议分析的世界