1

リスト アイテムを更新するには、次のコードを使用します。

foreach (MyObject obj in listObj)
  {
      // modify fields              
      obj.myProperty = value; //any value
      objRepository.Modify(obj);
  }
contex.SubmitChanges();

問題は、このリストに 5000 を超えるレコードが含まれており、プロセスが非常に遅いことです。更新を早くする方法はありますか?SQLで直接?

ご協力ありがとうございました。

4

3 に答える 3

1

データベースを使用している場合、変更を保存するためにデータベースへの 5000 回以上のラウンド トリップが原因で、パフォーマンスが低下します。各往復は高価になる可能性があります。これらの変更を保存するための最善の策は、それらをバッチ処理することです。これは EF が行います (それがあなたが作業しているものだと思います)。

単一の SQL ステートメントを使用してリスト内のオブジェクトを識別できる場合、おそらくストアド プロシージャがそのデータを更新する最速の方法です。ただし、後でオブジェクトを更新しないと、オブジェクト キャッシュが基礎となるデータベースと同期しなくなるリスクがあります。Entity Framework を使用して、ストアド プロシージャをコンテキストにインポートし、それを直接呼び出すことができます。

他のオプションは、あなたが書いたものです - foreach ループです。生成されたものではなく、作成したものである場合は、リポジトリ クラスの Modify メソッドのプロファイリングを詳しく調べます。

これは、パフォーマンスのニーズがモデルの純粋さを上回るケースの 1 つかもしれません。私の経験では、EF やその他の ORM フレームワークは、オブジェクトを個別に扱う場合や小さなセットを扱う場合には優れていますが、中規模から大規模なデータ コレクション (数百のレコードのみ) を扱う場合は、セットベースのデータをオフロードする方がはるかに効率的であることがわかりました。データベースへの処理を行い、データベース エンジンに最適化された処理を実行させます。実行時間を数分から数秒に短縮することについて話し合っています。

頑張ってください!

于 2012-08-03T20:53:31.530 に答える
1

バッチ更新ウィッチlinq2sqlを実行する方法を示す古いが素晴らしい記事があります

http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx

于 2012-08-03T20:50:49.587 に答える
1

私の意見では2つの可能性:

  1. SQL 内にストアド プロシージャを実装し、データベースへの直接接続を介して直接アクセスします。コードなしで詳細なヘルプを提供するのは難しいですが、ステートメントが事前に準備されているため、LINQ to SQL ループよりも sp からより多くのパフォーマンスを絞り出す必要があります。実際に行っていることは、データをサーバーに渡し、残りはサーバーに任せることです。

  2. もう 1 つのオプションは、可能なパラメーターとしてキャッシュ サイズを受け入れるようにリポジトリを変更することです。つまり、メモリ内に特定の数のレコードがある場合、または x ミリ秒ごとに 1 回のいずれか早い方の時点でのみ、データベースへの変更に影響を与えるようにリポジトリに指示します。これは、パフォーマンスを向上させるために使用を開始する前に、StringBuilder に予約するスペースのアイデアを与えることができるという点で、StringBuilder の動作に似ています。

于 2012-08-03T21:01:58.497 に答える