1

複数の SQL ステートメントを SQL Server から DataTables にロードする必要があります。ほとんどのステートメントは、約 10.000 から 100.000 のレコードを返し、それぞれの読み込みに数秒かかります。私の推測では、これは単純に、移動する必要があるデータの量によるものです。ステートメント自体の処理にそれほど時間はかかりません。

そのため、Parallel.For() を使用してデータを並列にロードしようとしましたが、全体の処理時間が短縮されることを期待しています。パフォーマンスが 10% 向上しますが、それだけでは十分ではありません。理由としては、私のマシンがデュアル コアのみであるため、ここでの利点が制限されている可能性があります。ただし、プログラムがデプロイされるサーバーには 16 個のコアがあります。

私の質問は、どうすればパフォーマンスをさらに向上させることができるでしょうか? 非同期データ サービス クエリの使用は、PLINQ よりも優れたソリューション (BeginExecute など) でしょうか? それとも他のアプローチですか?

SQL Server は同じマシンで実行されています。これは、展開サーバーでも同様です。

編集: DataTable の代わりに DataReader を使用していくつかのテストを実行しました。これにより、読み込み時間が約 50% 短縮されました。すごい!それでも、マルチプロセッサ マシンを使用する場合、BeginExecute による並列処理によって全体の読み込み時間が改善されるかどうかは疑問です。誰もこれを経験していますか?これについて助けてくれてありがとう!

更新: 読み込み時間の約半分が SQL ステートメントの処理に費やされていることがわかりました。SQL Server Management Studio では、ステートメントにかかった時間はごくわずかでしたが、ADO.NET では、どういうわけか、はるかに長い時間がかかりました。したがって、DataTable をロードする代わりに DataReaders を使用し、SQL ステートメントを調整することで、初期ロード時間の約 25% まで短縮できました。Parallel.For() を使用して並列スレッドで DataReaders をロードしても、ここでは改善されません。だから今のところ、私は結果に満足しており、そのままにしておきます. おそらく、.NET 4.5 に更新するときに、非同期 DataReader の読み込みを試してみます。

4

3 に答える 3

1

私の推測では、これは単純に、移動する必要があるデータの量によるものです。

いいえ、SLOW フレームワークを使用しているためです。アプリの 1 つで、5 秒もかからずに 100 万近くの行をディクショナリに取り込んでいます。DataTables は遅いです。

于 2012-11-23T17:29:00.730 に答える
1

問題の性質を変える必要があります。正直に言うと、リクエストごとに 10.000 から 100.000 のレコードを表示する必要があるのは誰ですか? 誰もいないと思います。

ページングを処理することを検討する必要があります。あなたの場合、ページングは​​SQLサーバーで行う必要があります。これを明確にするために、"GetRecords" という名前のストアド プロシージャがあるとします。このストアド プロシージャを変更して、ページ パラメータを受け入れ、特定のページ (たとえば 100 レコードのみ) と合計ページ数に関連するデータのみを返します。アプリ内では、この 100 件のレコードを表示し (それらは飛びます)、選択したページ インデックスを処理します。

これがお役に立てば幸いです。

于 2012-11-23T20:57:33.670 に答える
0

これらのリクエストを頻繁にロードする必要がありますか? もしそうなら、分散キャッシュを使用してみませんか?

于 2012-11-23T17:08:22.903 に答える