私はこれについてコミュニティの視点を得たいと思っています。DB/IO に大きく依存するプロセスがある場合、Task Parallel ライブラリを使用して個々のプロセス パスを並列化するのはどの程度賢明でしょうか?
例を使用します...アイテムがたくさんあり、次の操作を行う必要がある場合
- 項目のリストについて DB にクエリを実行する
- パラメータの動的リストに基づいて特定の項目をグループ化するために、いくつかの集計操作を実行します。
- グループ化された結果ごとに、集計結果に基づいてデータベースにクエリを実行します。
- グループ化された結果ごとに、いくつかの数値計算を行います (3 と 4 が順番に行われます)。
- #3 で計算した結果に対していくつかの挿入と更新を行います
- #1で返された各アイテムに対していくつかの挿入と更新を行います
論理的に言えば、ステップ 3、5、6 でタスクのグラフに並列化できます。これは、1 つの項目が前の結果に影響を与えないためです。ただし、これらはそれぞれデータベース (SQL サーバー) で待機しますが、これは問題なく、SQL サーバーが許可する範囲でしか処理できないことを理解しています。
しかし、ローカル マシン上でタスクを論理的に分散させて、データベースが処理するのと同じくらい速く処理できるようにしたいと考えています。私は、db 呼び出しを Thread.Sleeps に置き換えたモック プロトタイプをいくつか作成しました (.SpinWait を使用していくつかのバリエーションも試しましたが、これは 100 万倍高速でした)。並列バージョンは、完全にシリアルである現在の実装よりもずっと高速です。まったく平行ではありません。
私が恐れているのは、SQL サーバーに過度の負担をかけることです...この道を進みすぎる前に、考慮すべき考慮事項はありますか?