Entity Framework CoreのInsert高速化 & InsertOrUpdateを行うライブラリ
数万件単位のレコードを登録するバッチアプリケーションを作成することになった。
公開されているWeb APIからデータを取得して、かなり編集をしてから登録するため、ストアドプロシージャは適していないし、生のSQLでやるのもミスが多そうなので避けたい。となると、Entity Frameworkを使うことになる。最新は Entity Framework Coreという名前になっているので、こちらを使った。
登録用データの作成までは良かったが、実際に動かしてみると、それなりに時間がかかった。スケジューラーに組み込んでいる他の処理との関係で、登録にかかる時間は短ければ短いほど良いので、大きく変えずに高速化する方法を調べると、公式サイトに以下のページがあった。
ここで紹介されているライブラリ「EFCore.BulkExtensions」を導入すると、Insert高速化 & InsertOrUpdateが出来るようになった。具体的な記録は取っていないけど10万レコードで試した所、確かに速くなっているように感じた。InsertOrUpdate機能も要件にマッチしていたので、これを採用することにした。
サイトの方に使い方がのっているが、簡単なサンプルを残しておく。削除は要件になかったので、使用せず。
// EntityクラスBookを作成(POCO) Book book = new Book { // プロパティを設定 } // Insert Or Update処理。SQLのMERGE文が呼び出される // contextは、Entity Frameworkで作成したDbContextのサブクラス // 1レコードでもリストを作成する context.BulkInsertOrUpdate(new List<Book> { book });
実際に使用した時は、リストに全て含めると、内1件でエラーが発生した時にどこでエラーになったかがSQLを見てもわからないため、数件ずつのリストに分割して呼び出すようにした。
以上