我有一个巨大的表(超过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)
。但是,如果有一个解决方案,我宁愿这是一个开箱即用的解决方案。
有人可以指出我正确的方向吗?
答案 0 :(得分:2)
忘记了
Linq 2sql不用于批处理操作。你真的需要将它移动到设定的操作级别以获得一些性能。
无论你做什么,你都会得到个人更新声明,因此没有表现。
我想最快的方法是做这样的事情:
使用foreach而不进行更改跟踪(ObjectTrackingEnabled = false
)
使用哈希构建内存数据结构
使用sqlbulkcopy批量插入临时表(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx)
使用“旧学校”更新语句更新大表
我想仍然采用这种方法,您可能希望一次将其缓冲到100k记录中
答案 1 :(得分:-1)
性能不佳来自于被跟踪的大量对象。这需要删除。
尝试以下方法: