我有一张表,我想每次更新100行。我有用于查找特定行的100个ID的列表。一旦找到,我为每一行更新一列(SyncOk)。EF SaveChangesAsync极慢
问题是,更新100行大约需要23到30秒。
dbContext.Configuration.ValidateOnSaveEnabled = false;
var count = ids.Count;
for (var i = 0; i < count; i++)
{
var id = ids[i];
var record = await dbContext.History
.FirstOrDefaultAsync(r => r.Id == id);
record.SyncOk = syncOk;
}
await dbContext.SaveChangesAsync();
一些注意事项:
ids
是一个IList<long>
保存所有感兴趣的标识。syncOk
是一个布尔。- 我试图将
AutoDetectChangesEnabled
属性设置为false,然后在设置SyncOk
值后手动更新记录 - 不会加快速度。
为什么SaveChangesAsync()
这么慢 - 我该如何提高上述功能的速度?恐怕表在23-30秒内被锁定,并且会使其他服务(使用同一个表)无法更新它。
它不是。数据库模式有问题(缺少索引也许?)或许多其他客户端正在碰到同一个表(即使是1秒也是如此)。在talbe上是否定义了任何触发器?你计时'SaveChanges'自己或实际执行100选择的整个代码? –
@PanagiotisKanavos:时间是执行上面的整个代码的持续时间。没有其他客户正在使用该表atm。让我回到你的索引。 – eightx2
然后,您计算与单个“SELECT TOP 1”查询相对应的100个单独的FirstOrDefaultAsync语句,而不是** SaveChanges。这只是一个糟糕的SQL。您应该告诉EF加载其ID在列表中的所有历史记录项目,类似于“WHERE x IN(...)”语句。 –