ホームページ > データベース > mysql チュートリアル > 大規模なデータセットを扱うときにパフォーマンスを最大化するために Entity Framework の挿入を最適化するにはどうすればよいですか?

大規模なデータセットを扱うときにパフォーマンスを最大化するために Entity Framework の挿入を最適化するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-23 22:02:10
オリジナル
936 人が閲覧しました

How Can I Optimize Entity Framework Inserts for Maximum Performance When Dealing with Large Datasets?

大規模なデータセットによる Entity Framework の挿入パフォーマンスの向上

大規模なデータセットを Entity Framework (EF) に挿入すると、時間がかかることがあります。この記事では、特に TransactionScopes を使用して大量のレコードを処理する場合に、このプロセスを大幅に高速化する手法について説明します。

SaveChanges() 通話の最適化

レコードごとに SaveChanges() を呼び出す一般的な方法は、一括挿入では非効率的です。 代わりに、次の代替案を検討してください:

  • バッチ SaveChanges(): すべてのレコードがコンテキストに追加された後、SaveChanges() を 1 回だけ呼び出します。
  • 間隔 SaveChanges(): 設定されたレコード数 (例: 100 または 1000) の後で SaveChanges() を呼び出します。
  • コンテキストのリサイクル: SaveChanges() を呼び出し、コンテキストを破棄し、一定数のレコードの後に​​新しいコンテキストを作成します。

これらの方法により、データベースのラウンドトリップが削減され、変更追跡によるオーバーヘッドが最小限に抑えられます。

効率的な一括挿入の実装

次のコードは、最適化された一括挿入を示しています。

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

        int count = 0;
        foreach (var entityToInsert in someCollectionOfEntitiesToInsert)
        {
            ++count;
            context = AddToContext(context, entityToInsert, count, 1000, true);
        }

        context.SaveChanges();
    }
    finally
    {
        if (context != null)
            context.Dispose();
    }

    scope.Complete();
}

private MyDbContext AddToContext(MyDbContext context, Entity entity, int count, int commitCount, bool recreateContext)
{
    context.Set<Entity>().Add(entity);

    if (count % commitCount == 0)
    {
        context.SaveChanges();
        if (recreateContext)
        {
            context.Dispose();
            context = new MyDbContext();
            context.Configuration.AutoDetectChangesEnabled = false;
        }
    }

    return context;
}</code>
ログイン後にコピー

この例では、パフォーマンス向上のために自動変更検出 (AutoDetectChangesEnabled = false) を無効にします。 AddToContext メソッドは、変更のコミットを処理し、オプションで指定された数のレコードの後に​​コンテキストを再作成します。

ベンチマーク結果

560,000 レコードを使用したテストでは劇的な改善が見られました:

  • レコードごと SaveChanges() : 時間
  • SaveChanges() 100 レコード後: 20 分以上
  • SaveChanges() 1000 レコード後 (コンテキスト破棄なし): 242 秒
  • SaveChanges() 1000 レコード後 (コンテキスト破棄あり): 191 秒

結論

これらの戦略により、Entity Framework の一括挿入のパフォーマンスが大幅に向上します。変更追跡を無効にし、バッチ SaveChanges() を使用し、コンテキストを効果的に管理することが、大規模なデータセットを効率的に処理するための鍵となります。

以上が大規模なデータセットを扱うときにパフォーマンスを最大化するために Entity Framework の挿入を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート