[EF][LINQ]BULK Insert簡易作法(附上簡易的效能比較數據)

  • 308
  • 0

[EF][LINQ]BULK Insert簡易作法(附上簡易的效能比較數據)

網路上很多的builk insert套件都是for .net用的,蠻多種的都可以採用(谷歌搜尋.net ef builk insert
不過,做事風格一向是精簡風的我,能不裝其他套件的話就懶的裝,這次分享一個非常入門簡易又方便使用的builk insert如下:
DbSet.AddRange(IEnumerable) 方法(這是.NET EF版本,版本6.0以上可以才可使用,5.0還有4.X版本都不能用)
DbContext.AddRange方法(這是.NET EF core版本,目前看起來版本1.0~當下最新的5.0都可以使用)

這個在以前工作上其實已經用過很多次,剛好最近測試的資料比較多,效能數據比較能看出差距(爽度有差?),就在這邊分享一下:
1. 實測三萬多筆資料insert並且使用迴圈逐筆執行DbSet.Add(要insert的物件)以及逐筆執行saveChanges():等了很久,應該三~五分鐘以上,都還沒跑完所有的insert,結果耐心喪失把他結束執行。
2. 實測三萬多筆資料insert並且使用迴圈逐筆執行DbSet.Add(要insert的物件)以及最後只有執行一次saveChanges():花了應該兩分鐘吧,也許算是使用者可接受的結果?不過還是蠻讓我等的不耐煩的。
3. 實測三萬多筆資料insert,先跑迴圈將三萬多筆資料放到一個List裡面,然後執行一次DbSet.AddRange(三萬多筆資料的List)以及最後執行一次saveChanges():大概15秒就全部跑完了,還算可以接受。

上面第三點的迴圈如果改成平行處理方式的Parallel.For搞不好會更快,但……懶的再測試了,效能夠用就好,這個就留給有興趣的朋友自行測試吧,個人覺得十幾秒已經是可以接受了。

這篇 大概是這樣……下台一鞠躬



參考資料:
自己的工作經驗