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如下的表中需要多久呢? 或者你的批量数据 ...
随机推荐
- Nginx安装echo模块
echo-nginx-module 模块可以在Nginx中用来输出一些信息,可以用来实现简单接口或者排错. 项目地址:https://github.com/openresty/echo-nginx-m ...
- DRDS SQL 审计与分析——全面洞察 SQL 之利器
背景 数据库存储着系统的核心数据,其安全方面的问题在传统环境中已经成为泄漏和被篡改的重要根源.而在云端,数据库所面临的威胁被进一步的放大.因此,对云数据库的操作行为尤其是全量 SQL 执行记录的审计日 ...
- MySQL抓包工具:MySQL Sniffer【转】
本文来自:https://github.com/Qihoo360/mysql-sniffer 简介 MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQLServer ...
- Squid实现正向代理及访问控制--技术流ken
Squid及正向代理简介 Squid cache(简称为Squid)是一个流行的自由软件,它符合GNU通用公共许可证.Squid作为网页服务器的前置cache服务器,可以代理用户向web服务器请求数据 ...
- 前端(五)之display 总结与浮动
前端之浮动布局.清浮动 display 总结 <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- c# 对JSON字符串排序(KEY/VALUE)
public string StortJson(string json) { var dic = JsonConvert.DeserializeObject<SortedDictionary&l ...
- Linux-学习patch命令打补丁,diff命令制作补丁(3)
patch:通过补丁文件,来对原文件打补丁 diff: 比较两个文件,然后生成一个补丁文件 1.patch用法 patch -p[剥离层级] <[补丁文件] 2.patch命令 ...
- Java高并发--CPU多级缓存与Java内存模型
Java高并发--CPU多级缓存与Java内存模型 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 CPU多级缓存 为什么需要CPU缓存:CPU的频率太快,以至于主存跟 ...
- python使用udp实现聊天器
聊天器简易版 使用udp实现一个简单的聊天器程序,要求如下: 在一个电脑中编写1个程序,有2个功能 1.获取键盘数据,并将其发送给对方 2.接收数据并显示 并且功能数据进行选择以上的2个功能调用 例子 ...
- Android Studio 学习(四) 数据库
文件存储 写数据 String data = "Data ti save"; FileOutputStream out =null; BufferedWriter writer = ...