C#アプリケーションは、Sql Serverから100万を超えるレコードを取得して処理し、データベースを元に戻します。この10万の更新ステートメントに近く、その結果、それらはすべてが次の形式を持っている -C#およびSQL Server
update Table1 set Col1 = <some number> where Id in (n1, n2, n3....upto n200)
「ID」はint型、クラスタ化インデックスを持つ主キーです。 2つの更新ステートメントは同じIDを更新するものではないので、理論的には、それらはすべてロックなしですべて並列に実行できます。したがって、理想的には、できるだけ多くを並行して実行する必要があります。すべてが5分以内で完了することが期待されます。
今、私の質問は、それを行う最も効率的な方法は何ですか?私は以下を試しています -
- これを順番に1つずつ実行しています - これは最も効率的なソリューションです。 1時間かかります。
- スレッドごとに各アップデートを起動することでそれらを同時に実行する - 何千ものスレッドを作成しているので非常に非効率的ですが、とにかく試しましたが、1時間以上かかってしまい、問題。
- 新しいテーブルに一括して挿入してから、更新用の結合を実行します。しかし、複数のユーザーがそれを実行することが予想されるため、同時実行の問題に遭遇します。
- 更新の代わりにバッチをマージする - 私はそれを試していないので、マージは実際に個々のアップデートステートメントよりも遅いと言っています。
大量のデータを処理する多くのアプリケーションでは、これが非常に一般的な問題であることが予想されます。標準的なソリューションはありますか?任意のアイデアや提案をいただければ幸いです。
これは役に立つかもしれません:http://stackoverflow.com/questions/20635796/bulk-update-in-c-sharp – TheDude
数千のスレッドを作成するのではなく、スレッドプールの使用を検討しましたか? – itsme86
リクエストのバッチを実行したいとします。 – TheDude