c#数据批量插入
由于之前面试中经常被问到有关EF的数据批量插入问题,今天以Sqlserver数据库为例,对.net中处理数据批量处理的方案进行了测试对比。
1.四种测试方案
(1)普通的EF数据批量插入:即调用DbSet中的Addrange方法
(2)不进行上下文跟踪的EF数据批量插入:即关闭自调用的DetectChanges方法,不对每一个添加的实体进行扫描
(3)在EF中执行sql批量插入
(4)Ado.net执行sql批量插入
(5)利用sqlserver的Bcp功能作批量插入:代码中利用了SqlBulkCopy类
2.相关环境
(1)数据库:sqlserver2014
(2)操作系统:win10
(3)cpu:i5-4210U
(4)内存:8G
3.测试
将以上5种方案,在数据量分别为100,1000,10000,100000的情况下进行测试,每种数据量级别测试3次
要插入的表如下所示:
3.1 普通的EF数据批量插入
用DbSet的AddRange方法作批量插入
3.2 不进行上下文跟踪的EF数据批量插入
用DbSet的AddRange方法作批量插入,且上下文不对增加的实体作跟踪,即代码中将context.Configuration.AutoDetectChangesEnabled设为false
3.3 在EF中执行sql批量插入
3.4 Ado.net执行sql批量插入
3.5 利用sqlserver的Bcp功能作批量插入
SqlBulkCopy类可对sqlserver数据库作批量处理,其原理是利用了sqlserver的Bcp功能,但需要将数据先写入到DataTable
4.测试结果
100条 | 1000条 | 10000条 | 100000条 | |
EF普通批量插入 | 331,41,51 | 1034,459,456 | 5200,5090,4921 | 55396,56479,58018 |
不进行上下文跟踪的EF数据批量插入 | 282,44,55 | 817,1152,547 | 6022,5523,5843 | 51465,52590,52037 |
EF中执行sql批量插入 | 7,4,4 | 52,32,45 | 811,388,380 | 插不进(sqlserver单次sql插入有限制) |
Ado.net执行sql批量插入 | 75,19,49 | 204,225,218 | 2177,2678,2387 | 插不进(sqlserver单次sql插入有限制) |
SqlBulkCopy批量插入 | 26,3,3 | 8,7,10 | 120,114,97 | 820,596,368 |
*注:单位为毫秒
5.结论
(1)利用sqlBulkCopy来对sqlserver作数据批量操作要明显好于其它四种方式,随着数据量增加效果越明显
(2)数据量在1万以内,用EF来做数据插入,其性能基本是能接受的,可以从EF中执行sql批量插入这种方式中看出,所以说ef在正常的业务开发中,数据插入基本不存在性能问题
(3)很奇怪的是EF中执行sql批量插入 这种方式明显好于原生的Ado.net执行sql批量插入这种方式,看来ef还是比较强大的
c#数据批量插入的更多相关文章
- 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解
SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常 ...
- C#中几种数据库的大数据批量插入
C#语言中对SqlServer.Oracle.SQLite和MySql中的数据批量插入是支持的,不过Oracle需要使用Orace.DataAccess驱动. IProvider里有一个用于实现批量插 ...
- SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)
1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...
- C#:几种数据库的大数据批量插入
在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...
- C#:几种数据库的大数据批量插入(转)
在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...
- C#:几种数据库的大数据批量插入 - faib
在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...
- PHP如何将多维数组中的数据批量插入数据库?
PHP将多维数组中的数据批量插入到数据库中,顾名思义,需要用循环来插入. 1.循环insert into 语句,逐渐查询 <?php /* www.qSyz.net */ @mysql_conn ...
- c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)
这篇文章主要介绍了c#几种数据库的大数据批量插入(SqlServer.Oracle.SQLite和MySql),需要的朋友可以了解一下. 在之前只知道SqlServer支持数据批量插入,殊不知道Ora ...
- 数据批量插入MSSQL
MSSQL数据批量插入优化详细 序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据 ...
随机推荐
- 腾讯qq发邮件
<本人新手> 首先要添加引用
- Ubuntu16.04环境下搭建基于三台主机的mysql galera cluster集群(实测有效)
(注意: (1)文中红色字体部分不一定需要操作 (2)由于word文档编辑的原因,实际操作时部分命令需要手动输入!!直接复制粘贴会提示错误!! ) 一 搭建环境: 1 Ubuntu16.04版本(系 ...
- 正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素
首先记住两句话 相等的两个对象,即equals(Object)方法判断两个对象相等,那么他们必须要有相同的hashcode hashcode相同的两个对象,他们可能相同,也可能不相同 简单地说可以这么 ...
- hadoop集群无法找到datanode节点问题解决
问题:在配置hadoop集群时,master的50070后台中找不到slave的datanode节点怎么办? 解决: 方法一:首先确认下master和slave的hdfs-site.xml配置中的df ...
- 在vue中配置flow类型检查
flow中文文档:https://zhenyong.github.io/flowtype/docs/objects.html#_ 1.安装flow npm install --save-dev flo ...
- ASP.NET WEB API简介
ASP.NET WEB API是基于.NET Framework用来构建Restful软件架构的框架,它是基于HTTP协议.Http不只是能够生成我们常见的web页面,它更是能够建立服务和面向资源 ...
- C#操作DataReader类
一.常用属性 名称 说明 Depth 获取一个值,用于指示当前行的嵌套深度 FieldCount 获取当前行中的列数 HasRows 获取一个值,该值指示 SqlDataReader 是否有行 IsC ...
- c# 怎么读取web.config中的配置项
ConfigurationManager.AppSettings["templateId"]
- [PHP]算法-堆排序的PHP实现
1.堆(二叉堆):可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素 2.给出某个结点的下标,可以计算出父结点的和孩子结点的下标; p ...
- python学习笔记(一)、列表和元祖
该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.通用的序列操作 有几种操作适用于所有序列,包括索引.切片.相加.相乘和成员资格检查.另外,Pyt ...