2017-02-20 142 views
1
public async Task BulkInsert(List<WagerInfo> wagers) 
{ 
    var tasks = wagers.Select(async x => await insert(x)); 

    await Task.WhenAll(tasks); 
} 
private Task insert(WagerInfo wager) 
{ 
    var sw = new Stopwatch(); 

    sw.Start(); 

    using (var db = new DBContext()) 
    { 
     db.Wagers.Add(wager); 

     await db.SaveChangesAsync(); 
    } 

    sw.Stop(); 

    log("save one record spent : " + sw.Elapsed); 
} 

這是插入記錄的簡單代碼。多插入使用異步等待

但日誌顯示保存的一條記錄有時會花費超過1秒。

保存一個記錄花費:00:00:00.0180819

保存一個記錄花費:00:00:00.0239751

保存一個記錄花費:00:00:00.0089301

保存一個記錄花費:00:00:00.0116161

保存一個記錄花費:00:00:00.0736537

保存Ø NE記錄花費:00:00:00.0711155

保存一個記錄花費:00:00:03.1613426

保存一個記錄花費:00:00:03.1703909

保存一個記錄花費:00:00: 03.1727551

保存一個記錄花費:00:00:07.8156325

保存一個記錄花費:00:00:07.8137410

保存一個記錄花費:00:0 0:07.8179925

保存一個記錄花費:00:00:00.0079545

保存一個記錄花費:00:00:00.0074952

但我的DBA說,他不趕執行的任何警報時間超過4秒。

爲什麼有一些記錄插入超過1秒?

如果我更改插入方法ado.net會更好?

+0

有問題與連接池的設置。由於它是獲得競爭等待,您登錄的連接池是一個補充說,時間到SQL執行時間...記錄時間一旦你有連接.... –

+0

謝謝你的提示!我會嘗試。 – user1485954

回答

0

保存更改針對同一事務中的多個插入進行了優化。

以500或1000個插入塊的形式拆分列表。

然後打電話給你的Task insertList <WagerInfo>到前SaveChangesAsync