我是靠谱客的博主 默默钢笔,最近开发中收集的这篇文章主要介绍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,511034,459,4565200,5090,492155396,56479,58018
不进行上下文跟踪的EF数据批量插入282,44,55817,1152,5476022,5523,584351465,52590,52037
EF中执行sql批量插入7,4,452,32,45811,388,380插不进(sqlserver单次sql插入有限制)
Ado.net执行sql批量插入75,19,49204,225,2182177,2678,2387插不进(sqlserver单次sql插入有限制)
SqlBulkCopy批量插入26,3,38,7,10120,114,97820,596,368

 

*注:单位为毫秒

5.结论

(1)利用sqlBulkCopy来对sqlserver作数据批量操作要明显好于其它四种方式,随着数据量增加效果越明显

(2)数据量在1万以内,用EF来做数据插入,其性能基本是能接受的,可以从EF中执行sql批量插入这种方式中看出,所以说ef在正常的业务开发中,数据插入基本不存在性能问题

(3)很奇怪的是EF中执行sql批量插入 这种方式明显好于原生的Ado.net执行sql批量插入这种方式,看来ef还是比较强大的

转载于:https://www.cnblogs.com/yyg1986/p/9827491.html

最后

以上就是默默钢笔为你收集整理的c#数据批量插入的全部内容,希望文章能够帮你解决c#数据批量插入所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部