2015-12-15 57 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(); 
      } 
     }