2015-12-15 59 views
1

我正在開發一個系統,它在工作時將用新ID更新數據庫中給定數量的行。更新多行的快速方法

目前我有約900萬行,並且在選擇了一小部分數據(〜10k條目)之後,我想遍歷每個這些條目並用一個新的ID更新一列。

我目前做的工作,但速度太慢,無法使用,所以我需要改進它。這裏是代碼,這最初是一個ForEach循環,但我讀了'對於'數組循環更快,所以我試圖沒有太大的改善。

public string UpdateWithNewWidgetId(List<string> allTheWidgetIds, int newWidgetId) 
    { 
    var repoPerson = _repositoryFactory.CreateRepository<Person>(); 

     try 
     { 
      var person = repoPerson.GetAll(x => fieldToUpdate.Any(val => x.WidgetId == val)).ToArray; 


      for (int i = 0; i < person.Length; i++) 
      { 
       person[i].WidgetId= newWidgetId; 
       repoPerson.Update(person[i]); 
      } 

      repoPerson.SaveChanges(); 
     } 
     catch (Exception ex) 
     { 
      //log error 
     } 

因此,repoPerson很快返回10K左右的項目列表,但foreach循環需要年齡,然後調用SaveChanges(這只是做了Context.SaveChanges())需要更長的時間。

最初我在foreach中有SaveChanges,並認爲這是我的問題,但從循環中刪除它並沒有改善。

+3

我將要求大運營 – Tuco

+0

存儲過程,我會調查使用一個存儲過程,在上面的例子中,你會推薦通過做整個事情存儲或只是更新? –

回答

1

對於需要通過這個主題看起來的大數據量:

Bulk Update in C#

一般來說,如果你需要進行大量的插入/更新數據,實體框架是不夠的 - 需要使用SqlBulkCopy的這種方法要快得多。

+0

SqlBulkCopy不執行更新 – stuartd

+0

在我提到的主題中,有一個使用中間表的很好的解決方法。 – MagisterCrazy

+0

@MagisterCrazy只是爲了澄清 - 在那個鏈接的主題中,是你選擇的解決方案還是其他答案? –

-1

嘗試添加交易,應加快背景下的SaveChanges事件

using (Context context = new Context()) 
     { 
      using (var dbContextTransaction = context.Database.BeginTransaction()) 
      { 
      ...yours code 
      context.SaveChanges(); 
      dbContextTransaction.Commit(); 
      } 
     }