由于之前面试中经常被问到有关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#数据批量插入的更多相关文章

  1. 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解

    SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常 ...

  2. C#中几种数据库的大数据批量插入

    C#语言中对SqlServer.Oracle.SQLite和MySql中的数据批量插入是支持的,不过Oracle需要使用Orace.DataAccess驱动. IProvider里有一个用于实现批量插 ...

  3. SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

    1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...

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

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  5. C#:几种数据库的大数据批量插入(转)

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  6. C#:几种数据库的大数据批量插入 - faib

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  7. PHP如何将多维数组中的数据批量插入数据库?

    PHP将多维数组中的数据批量插入到数据库中,顾名思义,需要用循环来插入. 1.循环insert into 语句,逐渐查询 <?php /* www.qSyz.net */ @mysql_conn ...

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

    这篇文章主要介绍了c#几种数据库的大数据批量插入(SqlServer.Oracle.SQLite和MySql),需要的朋友可以了解一下. 在之前只知道SqlServer支持数据批量插入,殊不知道Ora ...

  9. 数据批量插入MSSQL

    MSSQL数据批量插入优化详细   序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据 ...

随机推荐

  1. 阿里AI设计师一秒出图,小撒连连惊呼,真相是...

    近期,央视<机智过人>的舞台上来了位“三超设计师”——设计能力超强:出图能力超快:抗压能力超强,成功迷惑嘉宾和现场观众,更让撒贝宁出错三连. 节目一开场,这位“设计师”就为现场嘉宾:主持人 ...

  2. mysql列反转Pivoting

    Pivoting是一项可以把行旋转为列的技术.在执行Pivoting的过程中可能会使用到聚合.Pivoting技术应用非常广泛.下面讨论的都是静态的Pivoting查询,即用户需要提前知道旋转的属性和 ...

  3. mybatis-generator插件执行报错:Cannot resolve classpath entry

    记录一个小问题 使用了mybatis-generator插件自动生成实体类,DAO,Mapper,在执行时报错.报错信息如下 Failed to execute goal org.mybatis.ge ...

  4. lua的面向对象

    Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,见如下代码: Account = {balance = } function Account.withdraw(v) Accou ...

  5. Docker在Linux上运行NetCore系列(二)把本地编译好的镜像发布到线上阿里云仓库

    转发请注明此文章作者与路径,请尊重原著,违者必究. 系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 开始 本篇文章结束在本地创建完成镜像后, ...

  6. 如何扩展VS2017未安装的功能

    扩展VS2017未安装的功能 我们在使用VS2017时,由于VS2017该ide功能过于强大,使用范围涵盖多个领域,我们在安装VS2017时很多时候只需要安装自己需要的某部分的功能即可,这个步骤在软件 ...

  7. Spring Boot 设置静态资源访问

    问题描述 当使用spring Boot来架设服务系统时,有时候也需要用到前端页面,当然就不可或缺地需要访问其他一些静态资源,比如图片.css.js等文件.那么如何设置Spring Boot网站可以访问 ...

  8. UML 序列图

    序列图      序列图主要用于按照交互发生的一系列顺序,显示对象之间的这些交互.显示不同的业务对象如何交互,对于交流当前业务如何进行很有用.序列图是一个用来记录系统需求,和整理系统设计的好图.序列图 ...

  9. C# 插入条码到Excel指定单元格

    .NET中Barcode Library的应用二 介绍 在上一篇中我已经简单介绍了这个函数库(条形码应用之一------------函数库的简介).在这一篇中我将使用这个库提供更多的操作,希望对大家有 ...

  10. C++中的stack类、QT中的QStack类

    C++中的stack 实现一种先进后出的数据结构,是一个模板类. 头文件 #include<stack> 用法(以int型为例): stack <int> s; //定义一个i ...