1

我有一个SQL表,其中有大约1亿行左右的SQL表,并且它的模式由EF迁移管理。在EF迁移中更新大量数据

我想更改链接到该表的枚举值,所以我需要将数据库中的所有值更新为新值。像下面的东西。

this.Sql("UPDATE MyTable SET MyEnum=0 WHERE MyEnum=-1"); 

这将是所有的好上一个较小的表,但因为表的大小它不是真的适合在一气呵成运行这样一个大的更新(我得到的连接超时,tempdb的空间问题,事务日志空间问题等)。分批做这件事情会更好。例如:

while(ctx.MyTable.Any(m =>m.MyEnum == -1)) 
{ 
    this.Sql("UPDATE TOP (1000000) MyTable SET MyEnum=0 WHERE MyEnum=-1"); 
} 

不幸的是我不能在迁移过程中摸出一个方式从表中读取(例如,如何可以在迁移过程中ctx.MyTable.Any(m =>m.MyEnum == -1)做到这一点)。有没有办法做到这一点,以便我可以在EF迁移更新中进行批处理。

回答

-1

我的建议是基于确切知道EF对你有多慢(即使是分批进行),你会创建一个存储过程来完成你想做的事,然后只是迁移时只需调用该存储过程即可。它应该,希望能快速运行,因为一切都将在SQL的一面完成。

+0

我已经在运行一个原始的SQL更新(根本不是EF),一个SP很容易出现同样的问题,因为它在超时时间内不会完成,并且在执行时会使用大量的log/tempdb空间。 – 2014-10-28 20:28:34