2017-02-20 12 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レコードが時々1秒以上費やされたことが示されています。 00:00:1のセーブ00.0089301

過ごした1つのレコードの保存00.0239751

:00:00:過ごした1つのレコードの保存00.0180819

:00:00:過ごした1つのレコードの保存

レコードは過ごし:00:00:00:00:1つのレコードを過ごし保存00.0116161

00.0736537

O保存00:00:00.0711155

過ごした1つのレコードの保存:00:00:00:00:03.1613426

過ごした1件のレコードを保存午前0時:03.1703909

一つのレコードを過ごし保存過ごしNEレコード: 0:00:1つのレコードを過ごし保存07.8137410

:00:00:過ごした1つのレコードの保存07.8156325

:00:00:過ごした1つのレコードの保存03.1727551

0:1つのレコードの保存07.8179925

は、使用済み:00:00 00.0074952

しかし、私のDBAは、彼は実行のいずれかの警告をキャッチしていないと述べた:00:00:1つのレコード保存00.0079545

は、使用済み4秒以上の時間。

なぜ1秒以上のレコードが挿入されるのですか?

私はado.netへの挿入方法を変更すると良いでしょうか?

+0

あり、接続プールの設定で問題が...により、接続のプールには、競合を得ることに待っている、あなたがいることを追加してログインしますSQL実行時間の時間...一度あなたが接続を持ってログのタイミングを... –

+0

あなたの先端に感謝!やってみます。 – user1485954

答えて

0

変更の保存は、同じトランザクション内の複数の挿入に対して最適化されます。

リストを500または1000個のチャンクで分割します。

その後、あなたは正しいSaveChangesAsync

関連する問題