我有一張表,我想每次更新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(...)」語句。 –