ホームページ >データベース >mysql チュートリアル >Entity Framework での一括挿入のパフォーマンスを最適化するにはどうすればよいですか?

Entity Framework での一括挿入のパフォーマンスを最適化するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-23 21:57:09809ブラウズ

How Can I Optimize Bulk Insertion Performance in Entity Framework?

Entity Framework のバッチ挿入パフォーマンスの最適化の詳細な説明

Entity Framework を使用して大量のデータをデータベースに挿入するのは、困難な作業となる場合があります。特にトランザクション スコープ内で作業し、データ量が 4000 レコードを超える場合、トランザクションが不完全になる可能性があります。

この問題を解決するには、すべてのレコードで SaveChanges() を呼び出すとパフォーマンスに重大な影響を与える可能性があることを理解することが重要です。次の最適化戦略を採用することをお勧めします:

  1. 一度に SaveChanges() を呼び出す: 各レコードが保存された後に SaveChanges() を呼び出す代わりに、変更を蓄積し、すべてのレコードが処理された後にすべてを一度に保存します。

  2. バッチ SaveChanges(): すべてのレコードを一度に保存するのがまだ遅すぎる場合は、特定のレコード数 (例: 100) ごとに SaveChanges() を呼び出すことを検討してください。

  3. コンテキストを定期的に作成および解放します: 変更をバッチ処理する場合は、新しいコンテキストを作成し、バッチごとに既存のコンテキストを解放して、コンテキスト内に蓄積されたエンティティをクリアすることを検討してください。

  4. 変更検出を無効にする: 自動変更検出を無効にすることで、Entity Framework は変更の追跡に時間を費やすことなく、新しいレコードの挿入に集中できます。

コード例:

<code class="language-csharp">using (TransactionScope scope = new TransactionScope())
{
    using (var context = new MyDbContext())
    {
        context.Configuration.AutoDetectChangesEnabled = false;

        int count = 0;
        foreach (var entity in entities)
        {
            ++count;
            context.Set<MyEntity>().Add(entity); // 使用更明确的类型

            if (count % 100 == 0)
            {
                context.SaveChanges();
            }
        }

        context.SaveChanges(); // 保存剩余的记录
    }

    scope.Complete();
}</code>

パフォーマンスベンチマーク:

560,000 エンティティを使用したテストでは、次のベンチマーク結果が観察されました:

  • コミット数: 1、コンテキストの再作成: いいえ: 20 時間以上
  • コミット数: 100、コンテキストの再作成: いいえ: 20 分以上
  • コミット数: 1000、コンテキストの再作成: いいえ: 242 秒
  • コミット数: 10、コンテキストの再作成: はい: 241 秒
  • コミット数: 100、コンテキストの再作成: はい: 164 秒

これらの最適化により、パフォーマンスが大幅に向上し、トランザクション タイムアウト制限内で大規模なデータ セットの挿入が確実に成功します。 適切なバッチ サイズを選択し、コンテキストを再作成するかどうかを選択するには、実際の状況に基づいた調整とテストが必要です。

以上がEntity Framework での一括挿入のパフォーマンスを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。