【问题标题】:Entity Framework: Slow migrations with large volumes of data实体框架:具有大量数据的缓慢迁移
【发布时间】:2021-05-16 13:09:05
【问题描述】:

我们在数据层中使用 Entity Framework Core,发现当对包含大量数据(数百万行)的表执行大量操作时,迁移速度非常慢。

例如,目前我们正在调整整个数据库中字符串 (varchar) 列的大小。随着每列长度的更改,EF 将删除所有表索引和约束并重新创建它们。例如,如果我们有 1 个索引和 10 个列发生了变化,EF 将删除并重新创建索引 10 次,而不是简单地删除一次索引,更改列,然后重新创建索引。

在我们的一些表格中,单个列更改需要 30 多分钟才能完成,而我们想要进行大约 200 列更改。

是否可以更改此行为以在迁移开始时删除所有索引并在结束时重新创建它们?

【问题讨论】:

  • 看起来像是 EF Core 的问题。在这里,我们需要特定迁移的示例,它可以将想法重新创建 10 次。
  • 我认为不需要具体的例子。问题很简单,是否可以在迁移开始时全部删除索引,执行多个操作并在迁移结束时重新创建索引。

标签: entity-framework-core database-migration entity-framework-migrations


【解决方案1】:

我们最终创建了两个迁移来解决这个问题。

首先,我们将隐藏DbContext 类中的所有索引定义。然后我们创建一个迁移,它自然会删除所有索引。

其次,我们对数据结构进行更改并取消注释索引定义。第二次迁移会改变结构并重新添加索引。

【讨论】:

    【解决方案2】:

    如果您的列长度更改都发生在一次迁移中,您应该能够执行migrationBuilder.Sql(@"-- drop index statements here"); 之类的操作,然后您的所有列长度都更改,然后migrationBuilder.Sql(@"-- recreate index statements here");

    我认为这里的关键是确保您在这些语句之间进行尽可能多的列长度更改,以尽量减少对性能的影响。当然,要对您同时进行的所有更改进行风险评估。

    【讨论】:

    • EF 将继续尝试随着每列长度的变化而删除索引。可以做的是注释掉 DbContext 中的所有索引,创建一个新迁移,然后应用列更改并创建另一个迁移,最后取消注释索引并进行另一个迁移。我希望有一种更优雅的方法。
    猜你喜欢
    • 2019-06-24
    • 2014-07-08
    • 1970-01-01
    • 2014-02-12
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多