[英]EF SaveChangesAsync extremely slow
我有一个表,我想一次更新100行。 我列出了用于查找特定行的100个ID。 找到后,我为每一行更新一列(SyncOk)。
问题是更新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>
,其中包含所有感兴趣的ID。 syncOk
是一个布尔值。 AutoDetectChangesEnabled
属性设置为false,然后在设置SyncOk
值后SyncOk
手动更新记录-不会加快速度。 为什么SaveChangesAsync()
这么慢- 如何提高上述功能的速度? 恐怕该表在23到30秒内被锁定,并且会使其他服务(使用同一表)也无法更新它。
您正在执行的ids.Count
总数为数据库ids.Count
SELECT语句。 如果添加代码,则可以看到:
dbContext.Database.Log += Console.WriteLine;
通过一次获取所有数据,尝试最小化对SQL实例的访问:
var records = await dbContext.History.Where(i => ids.Contains(i.Id)).ToListAsync();
然后,您应该执行所需的修改:
foreach(var record in records)
{
record.SyncOk = syncOk;
}
await dbContext.SaveChangesAsync();
您也可以使用ForEachAsync
,该查询将只查询一次上述代码部分的结果:
await dbContext.History.Where(i => ids.Contains(i.Id))
.ForEachAsync(i => i.SyncOk = syncOk);
await dbContext.SaveChangesAsync();
恕我直言, Select * from History where Id in (YourList)
下面的Select * from History where Id in (YourList)
中执行Select * from History where Id in (YourList)
。
var listOfRecordsToBeUpdated = await dbContext.History
.Where(r => ids.Contains(r.Id)).ToListAsync();
//It will detect the changes each time when you update the entity
// Make sure you re-enable this after your bulk operation
DataContext.Configuration.AutoDetectChangesEnabled = false;
//Iterate through the records and assign your value
listOfRecordsToBeUpdated.Foreach(x=>x.SyncOk = syncOk);
DataContext.Configuration.AutoDetectChangesEnabled = true;
await conn.SaveChangesAsync();
我尝试实现其他两个答案建议的更改-但是具有相同的性能结果(即,速度没有变化)。
通过使用原始SQL命令,我极大地提高了性能(并解决了我的问题):
var stringOfIds = string.Join(",", ids);
await dbContext.Database.ExecuteSqlCommandAsync(
$"UPDATE dbo.History SET SyncOk = 1 WHERE Id IN ({stringOfIds})");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.