批量/批量SQL服务器更新

时间:2013-04-02 17:19:06

标签: c# asp.net entity-framework-5 azure-sql-database eager-loading

代码

foreach (var item in _context.Duiven.
                .Include(p => p.Duivenmelker.VoedselInstelling)
                .Include(p => p.VoedselHistoriek)
                .Include(p => p.Duivenmelker.Personeel)
                .Include("Ziektes.DuifZiekte")
                .ToList() // 25.000)
            {
                item.FoodHistory();
                item.HealthSimulation();
                item.DiseaseSimulation(diseaseTypes);
                item.CureSimulation(_context);
                item.DeathSimulation();
                item.Feed();
}

_context.SaveChanges()

问题

以上代码循环通过aprox。 25000项。 它会更新这些对象上的各种内容(此过程大约需要10分钟) 问题在于将所有这些更改保存到数据库中,这需要将近2个小时。

它可能会逐个更新(sql)每个更改吗? (这是sql azure) 该过程还包括删除25000条记录和插入25000个新的(4个整数)

我通过包含大量需要来减少对数据库的调用。但我发现这不是过程,而是需要很长时间的节约:S

问题

[更新记录中的所有值]与之间的执行是否存在差异? [删除当前&插入新的??

如何将此保存到数据库?比如10分钟而不是160米?

2 个答案:

答案 0 :(得分:3)

实体框架不太适合批量更新。

我遇到了同样的情况,最后重写了我的批量更新逻辑,以便将ADO.Net与存储过程一起使用。对于我的特定用例,性能提升约为10倍。

另一个选项可能是SqlBulkCopy,具体取决于您的具体情况。

答案 1 :(得分:0)

您可以使用一些技巧,例如每100次操作只能提交一次。

但是,我总是不得不回避为数据库操作编写存储过程,这些操作从ORM中执行得太慢。