1. 程式人生 > >c#數據批量插入

c#數據批量插入

image 比較 每一個 分享 結果 datatable order 增加 性能問題

由於之前面試中經常被問到有關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#數據批量插入