天天看點

EntityFramework.BulkInsert擴充插入資料和EF本身插入資料比較

擴充下載下傳位址: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);