EF批量插入(轉)


原作者地址http://blog.csdn.net/zlts000/article/details/46385773

 

之前做項目的時候,做出來的系統的性能不太好,在框架中使用了EntityFramework,於是就在網上查資料,研究如何提高EF的性能。 
在這分享一篇博客 批量操作提升EntityFramework的性能 
里面提供了一個擴展庫Entity Framework擴展庫,在這里面找到了一些比較好的方法。下面主要介紹其中的一個方法—-批量添加BulkInsert。


這些擴展方法在哪里找?


在VS中新建EF之后,右鍵解決方案下的引用, 選擇管理NuGet程序包,搜索Z.EntityFramework.Extensions並安裝。

這里寫圖片描述

然后在類里面添加引用之后就可以直接點出來。


批量添加和EF本身自帶的添加性能提高了多少?


下面咱們就用實例說話: 
構造一個10W個studentinfo實例:

            '''定義要添加數據的條數''' int customerCount = 100000; '''定義一個實體集合''' List<studentInfo> customers = new List<studentInfo>(); '''想集合中添加數據''' for (int i = 0; i < customerCount; i++) { studentInfo customer = new studentInfo() { name = "2" + i, sex = "2" + i, studentID = "2" + i, age = "2" }; customers.Add(customer); Console.Write("."); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

用EF自帶的添加方法將數據添加到數據庫中,為了計算使用時間,加上StopWatch:

'''開始計時''' Stopwatch watch = Stopwatch.StartNew(); using (EFTestEntities dbcontext = new EFTestEntities()) { foreach (var entity in customers) { dbcontext.studentInfoes.Add(entity); } dbcontext.SaveChanges(); } '''計時結束''' watch.Stop(); '''輸出時間''' Console.WriteLine(string.Format("{0} customers are created, cost {1} milliseconds.", customerCount, watch.ElapsedMilliseconds));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

好了現在運行,等待中…… 
哎~~實在是沒有耐心等待它運行完。 
怎么辦,減少數據量,先添加1000條:

這里寫圖片描述

還好,用時6157毫秒,6.157秒;

接着走,把數據量改為10000條:

這里寫圖片描述

運行完了,共117096毫秒,117.096秒,將近兩分鍾。實在是沒有耐心再測100000條的了,接下來直接測批量添加的方法。

將上面的添加到數據庫中的代碼換成下面的代碼:

dbcontext.BulkInsert(customers); dbcontext.BulkSaveChanges();
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

直接上10W條:

這里寫圖片描述

運行完了,共3592毫秒,3.592秒,真快啊~~

那么20W呢?

這里寫圖片描述

20W條數據運行完,才花了6346毫秒,6.346秒的時間。比上面的方法添加1000條的數據用的時間差不多,看來EF自帶的添加方法慢,是毋庸置疑的了。


為什么擴展方法用的時間這么少?


EF自帶的方法,會增加與數據庫的交互次數,一般地,EF的一個上下文在提交時會打開一個數據連接,然后把轉換成的SQL語句一條一條的發到數據庫端,然后去提交,下面的圖片是我用SQL Server Profiler記錄的和數據庫交互的操作,這只是一小部分,試想,如果你的數據量達到萬級別(更不用說百萬,千萬數據了),那對數據庫的壓力是很大的

這里寫圖片描述

而擴展方法運行時與數據庫的交互是這樣的:

這里寫圖片描述

批量添加的方法是生成一條SQL語句,和數據庫只交互一次。那為什么圖片中有多條Insert語句呢,當你使用BulkInsert時,如果數據達到4萬之前,那在SQL的解釋時,也是很有壓力的,有多情況下會超時,當然這與你的數據庫服務器有關,但為了性能與安全,將Bulk操作變為分批提交,即將上W的數據進行分解,分用1W數據量提交一次,這樣,對數據庫的壓力就小一些。

源代碼下載:EF擴展方法BulkInsert(批量添加)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM