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#數據批量插入