DBContextに約18000個のオブジェクトをAdd()しようとしていました。約5分かかりました。SaveChanges()を使用してこのデータを保存するには、さらに時間がかかりました。通常のリストを作成してオブジェクトを追加するように切り替えた後、SqlBulkCopyを使用してデータを永続化しました。これには約5秒かかりました。
Addメソッドは何をするので、時間がかかりますか?
DBContextに約18000個のオブジェクトをAdd()しようとしていました。約5分かかりました。SaveChanges()を使用してこのデータを保存するには、さらに時間がかかりました。通常のリストを作成してオブジェクトを追加するように切り替えた後、SqlBulkCopyを使用してデータを永続化しました。これには約5秒かかりました。
Addメソッドは何をするので、時間がかかりますか?
つまり、追加呼び出しごとに、コンテキストでDetectChangesが実行されます。これはオブジェクトグラフ全体を列挙するため、追跡するアイテムが多いほど、個々の追加にかかる時間が長くなります。これを回避して処理を高速化するために実行できるチューニングがたくさんあります(自宅の仮想マシンで約1k / sのインサートを取得します)。
効果的にEFを調整せずに、パフォーマンスを追加するのはO(n ^ 2)です。
これについては、次の記事でかなり詳しく説明します。
EntityFrameworkのパフォーマンスとAutoDetectChanges
調整時にEFが実行できる速度の詳細については、こちらをご覧ください。