C#实体框架-更新500000条以上记录中的列值



我们需要通过为每个记录中的特定列添加特定值来处理数据库中的500000条记录。

目前,我们正在使用TPL并行运行多个Task,每个Task都批量获取记录(大小为1000(更新值,并使用DBContext将它们写回数据库。这需要大约10分钟的时间来处理。

是否有更有效的方法来处理大型数据库?

EDIT-我们更新的值是动态生成的,这取决于记录信息

是否有更有效的方法来处理大型数据库?

运行SQL语句一次更改所有数据。不要觉得每次数据库更新都必须使用实体——直接在后端数据库上运行SQL脚本仍然没有错。EF中有一些方法可以运行自定义SQL,或者您可以有一个单独的";支持";不使用EF但直接管理数据的应用程序。

如果您无法直接使用T-SQL,请将方法更改为生成直接运行所需的T-SQL。如果值必须事先计算,并且每个记录的值都不同,那么这将是一种比在如此大的数据集上使用实体框架更快的方法。

代码库的体系结构和设计在这里起着关键作用。这些类型的问题就是为什么我们将域逻辑与数据访问逻辑干净地分离开来,这样业务规则和值的处理和计算就不会干扰您需要如何持久化它们,反之亦然。

例如,如果您有500000个业务实体类,您可以从存储库类中检索这些类并计算它们的所有值,然后您可以简单地枚举所有这些类并生成所需的SQL,或者将新的值和标识传递给数据访问层以执行优化的批量更新。

我没有在这个答案中提供代码的原因是,有很多方法可以使用我建议的方法来开发这个问题的解决方案

重要的是要理解,实体框架仍然是围绕工作单元概念(至少EF6(设计的,并且没有针对批量工作负载进行优化(选择查询场景除外(。设计良好的代码库肯定会在数据访问层(或通过函数和存储过程的数据库(混合使用EF和T-SQL来处理性能关键操作。

最新更新