擴充下載下傳位址:http://efbulkinsert.codeplex.com/
注意同時安裝依賴項目,不然會報錯,還有,程式中有同一個dll的其他版本,那就可能一次安裝不上,得一個一個安裝依賴的dll
Install-Package EntityFramework.MappingAPI -Version 6.0.0.7
Install-Package EntityFramework.BulkInsert-ef6
EntityFramework.BulkInsert插入資料和EF比較
初步猜測,它應該隻是把多個sql合成一個,不管怎麼優化,總該最後生成的是sql。
例如:20條資料,ef調試時看到的是一次連接配接,20次執行sql,這個批量,估計是一次連接配接,20個sql組合放到一個字元串送出,這樣能減少時間。
再優化也不可能把sql給減少,同一sql在資料庫中執行時間也不是EF能減少的。
實測(222資料庫,表FinanceReceipts):
用Stopwatch監視執行時間(機關毫秒)
一次插入200條單據測試
EF插入耗時:11,086
BulkInsert插入耗時:740
一次插入10000條單據測試
EF插入耗時:510,640
BulkInsert插入耗時:3,200
通過看代碼,和猜測的實作方式差不多,不過,代碼中有表映射,為什麼有這些功能?
因為 Insert 比資料庫自帶的 SqlBulkCopy 功能慢,
EntityFramework.BulkInsert擴充在優化語句傳輸次數的同時,也采用了速度更快的 SqlBulkCopy 去将資料插入資料庫,是以在插入大資料量時,比起EF本身的插入資料,可以說快得“離譜”。
不過,利用這個SqlBulkCopy快速插入資料,也就隻能在插入上有改進,對于Update,Delete資料,速度上沒有什麼改進的
//批量插入測試代碼
插入100條,每次插入一條,循環插入測試
第1次:
EF插入耗時:9006
BulkInsert插入耗時:4173
第2次:
EF插入耗時:8738
BulkInsert插入耗時:3806
第3次:
EF插入耗時:8784
BulkInsert插入耗時:3727
BulkInsert還是比EF本身插入資料稍微快一點,總的來說:
BulkInsert 大緻是隻傳一次sql語句,并用SqlBulkCopy快速插入(單據+單據明細+單據日志);
而EF是每個實體一條普通的Insert插入(單據1次,單據明細有多少條就傳多少次,單據日志有多少條就傳多少次)
//每次插入一條,循環插入的測試代碼
附:EntityFramework.BulkInsert 突出點是快,但是實際應用上,有諸多不便,比如:
我們用EF插入,自動增長鍵會帶回資料庫中的值,但是BulkInsert 不會;
外鍵關聯表的資料,比如:日志、詳情,用EF時,如果有資料會自動插入;用BulkInsert 不會插入,隻會插入主表的資料,還要自己根據業務,查詢出主表的主鍵然後指派給 日志、詳情的外鍵字段,然後我們才可以将這些資料再次插入資料庫。
這個是比較麻煩的地方。
最新:
雖然在事務using語句中,但 ctx.BulkInsert(entityArray); 不會復原事務 ,
加上參數,才能復原:ctx.BulkInsert(entityArray, tran.UnderlyingTransaction);