ARRAYオブジェクトに大量のデータ(たとえば100.000行)を挿入する場合、どちらが高速だと思いますか?
- Entity Frameworkを介して?
SaveChanges()
( uが100.000行を挿入したときに呼び出します) INSERT
ストアドプロシージャを使用してすべての行を(100.000回)ループしますか?
あなたがまた非常に素晴らしいだろう参照を提供することができれば。
ありがとう
ARRAYオブジェクトに大量のデータ(たとえば100.000行)を挿入する場合、どちらが高速だと思いますか?
SaveChanges()
( uが100.000行を挿入したときに呼び出します)INSERT
ストアドプロシージャを使用してすべての行を(100.000回)ループしますか?あなたがまた非常に素晴らしいだろう参照を提供することができれば。
ありがとう
ストアドプロシージャの呼び出しを100K回ループすると、少なくとも100Kのクロスプロセスが作成されたり、クロスネットワーク呼び出しが遅くなります。
SQLサーバーを使用している場合、別のオプションは、TVP(テーブル値パラメーター)を使用して、C#コードからループ内の挿入を呼び出さないようにすることです。これにより、1回の呼び出しでデータのテーブルをストアドプロシージャに渡すことができます。
上記のリンクから、一度に1000行を推奨しています(ただし、常にアプリの測定と実験を行ってください)。
テーブル値パラメーターの使用は、セットベースの変数を使用する他の方法に匹敵します。ただし、テーブル値パラメーターを頻繁に使用すると、大規模なデータセットの方が高速になる可能性があります。テーブル値パラメーターよりも起動コストが高いバルク操作と比較して、テーブル値パラメーターは、1000行未満の挿入に対して適切に機能します。
したがって、(境界を100K回超えるのではなく)一度に1000行を通過して100回ループを試してみてください。
また、asp.netがアプリに一度に100Kのアイテムを持っている理由を再評価することもできます。それはサーバーに渡され、メモリの問題が発生する可能性があるため、一度にメモリに保持されますか?それを分割することはできますか?asp.netが10万行を読み取り、SQLサーバーエージェントジョブがより適切である可能性がある場所でデータ処理を行っていますか?アプリのデータフローとその機能に関する詳細を提供すると、人々はより多くのオプションを提供できる可能性があります。
実際に最速の方法は、この状況に合わせて設計されたSqlBulkCopyオブジェクトを使用することです。
ストアドプロシージャはより高速になります。Entity Frameworkにはバッチ処理がないため、データベースに10万回アクセスすることに加えて、EFのパフォーマンスオーバーヘッドが発生します。生のadoは、この種のもののORMよりも高速になります。
ここにいくつかの比較のリンクがありますhttp://blog.staticvoid.co.nz/2012/03/entity-framework-comparative.html比較 には生のado.netがありませんが、dapperが最も近いですそれにスピード。