Linq2sql更新了一个巨大的表中的每一行

时间:2014-11-30 14:54:21

标签: c# linq-to-sql sql-server-2008-r2

我有一个巨大的表(超过80M行),我使用linq2sql从数据库创建了一个模型。我遍历表(所有80M行)并用几个值更新每一行。我已经尽最大努力优化linq2sql代码周围的代码,但看起来db.SaveChanges()方法在第一次更新时挂起。

我的代码看起来像这样(我为了可读性而改述):

using(MessageListCtx db = new MessageListCtx())
{
   foreach(var message in db.MessageList.OrderByDescending(e => e.RecordId))
   {
      message.hashCode = Hasher.GenerateHash(message.name);
      db.SubmitChanges();
   }
}

我猜测问题在于,当我调用db.SubmitChanges();时,上下文中的所有对象都会被迭代进行更改,这需要一段时间才有超过80M的对象,但我不知道如何绕过此

我正在考虑使用for循环对结果进行分页。类似于:db.MessageList.Skip(i).Take(1000)。但是,如果有一个解决方案,我宁愿这是一个开箱即用的解决方案。 有人可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

忘记了

Linq 2sql不用于批处理操作。你真的需要将它移动到设定的操作级别以获得一些性能。

无论你做什么,你都会得到个人更新声明,因此没有表现。

我想最快的方法是做这样的事情:

我想仍然采用这种方法,您可能希望一次将其缓冲到100k记录中

答案 1 :(得分:-1)

性能不佳来自于被跟踪的大量对象。这需要删除。

尝试以下方法:

  • 使用一个没有状态跟踪的上下文来阅读您的记录
  • 使用单独的写入上下文编写每个更新,并在调用SaveChanges之前将实体附加到它上面