EF大資料大量新增效能問題

來源:互聯網
上載者:User

標籤:

前幾天做一個批量發訊息的功能,因為要向訊息表中批量寫入資料,用的EF架構的插入方法;不用不知道,一用嚇一跳;就10000條資料就耗時好幾分鐘,對應追求使用者體驗的我來說這是極不能容忍的,後來改為拼接SQL,效能提高了好幾倍;現在來分享一下經驗:

原始的方法類似這種:

 1         public ActionResult Add(ItemDetails entity) 2         { 3             var sw = new Stopwatch(); 4             sw.Start(); 5             using (db) 6             { 7                 for (var i = 0; i < 10000; i++) 8                 { 9                     db.ItemDetails.Add(entity);10                     db.SaveChanges();11                 }12             }13             sw.Stop();14             var date = sw.Elapsed;15             return Json(string.Format("總耗時:{0}", date));16         }

 

來看看添加10000條資料耗時:

就10000條資料就耗時這麼久,要是上百萬的資料量,那簡直就不能想象,再來看看最佳化後的:

產生SQL的方法:

 1 public class ItemDetailBatch 2     { 3         public static string BatchAdd(ItemDetails entity) 4         { 5             SqlParameter [] paras= 6             { 7                 new SqlParameter("@Item_Name",SqlDbType.VarChar,100),  8                 new SqlParameter("@Item_Price",SqlDbType.Int),  9                 new SqlParameter("@Image_Name",SqlDbType.VarChar,100), 10                 new SqlParameter("@Description",SqlDbType.VarChar,100),11                 new SqlParameter("@AddedBy",SqlDbType.VarChar,100)12             };13             paras[0] .Value= entity.Item_Name;14             paras[1].Value = entity.Item_Price;15             paras[2].Value = entity.Image_Name;16             paras[3].Value = entity.Description;17             paras[4].Value = entity.AddedBy;18             var sb=new StringBuilder();19             sb.Append("insert into ItemDetails (Item_Name,Item_Price,Image_Name,Description,AddedBy) ");20             sb.AppendFormat("values (‘{0}‘,{1},‘{2}‘,‘{3}‘,‘{4}‘)", paras[0].Value, paras[1].Value, paras[2].Value,paras[3].Value, paras[4].Value);21             return sb.ToString();22         }23     }

 

Controller層調用:

 1         public ActionResult Add(ItemDetails entity) 2         { 3             var sw = new Stopwatch(); 4             sw.Start(); 5             using (var db = new ShoppingDBConn()) 6             { 7                 var sql = new StringBuilder(); 8                 for (int i = 0; i < 10000; i++) 9                 {10                     //產生SQL11                     sql.Append(ItemDetailBatch.BatchAdd(entity));12                 }13                 //一次性執行SQL14                 db.Database.ExecuteSqlCommand(sql.ToString());15             }16             sw.Stop();17             var date = sw.Elapsed;18             return Json(string.Format("總耗時:{0}", date));19         }

介面資料:

同樣10000條總耗時:

EF沒添加一次都要向資料庫提交一次,而直接拼接SQL的方法就是減少與資料庫的互動次數,一次性提交執行所有資料;

 

EF大資料大量新增效能問題

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.