タスク並列ライブラリ (.Net 4.5) を使用して ADO .NET (.Net 4.5) データ アクセスを最適化しようとしています。たとえば、データベースから 1000,000,000 レコードを選択する場合、タスク並列でマシンのマルチコア プロセッサを効果的に使用するにはどうすればよいですか?図書館。誰かが完全なソースを使用してアイデアを得ることがわかった場合は、投稿してください:)
1 に答える
以下は、ADO.NETだけでなく、すべてのDBアクセステクノロジに適用されます。
クライアント側の処理は通常、データアクセスの問題を解決するには間違った場所です。スキーマを最適化し、適切なインデックスを作成し、適切なSQLクエリを作成することで、パフォーマンスを数桁向上させることができます。
適切なクエリで重要な2〜3レコードが返される可能性があるのに、遅延の大きい限られたネットワーク接続を介して、処理のために1Mレコードをクライアントに転送するのはなぜですか。
RDBMSシステムは、使用可能なプロセッサ、RAM、およびディスクアレイを利用して、クエリを可能な限り高速に実行するように設計されています。DBサーバーは通常、クライアントマシンよりもはるかに大量のRAMと高速なディスクアレイを備えています。
どのような種類の処理を行おうとしていますか?トランザクションデータを分析しようとしていますか?この場合、最初にデータをレポートに抽出する必要があります。さらに良いのは、OLAPデータベースにデータを抽出することです。適切なインデックスと事前に計算された分析を備えたスタースキーマは、分析用のOLTPスキーマよりも1000倍高速になる可能性があります。
SQLコーディングを改善すると、10倍から50倍以上の改善も得られます。SQLに慣れていないプログラマーによる一般的な間違いは、データを処理するためにセット操作の代わりにカーソルを使用することです。これは通常、50倍以下のオーダーの恐ろしいパフォーマンスの低下につながります。
すべてのデータをクライアントにプルして行ごとに処理するのはさらに悪いことです。これは基本的にカーソルを使用するのと同じです。データだけがネットワーク上を移動する必要があり、処理はクライアントの限られたメモリを使用する必要があります。
非同期処理が利点を提供する唯一の場所は、長い操作を実行し、処理が終了したときにコードを実行する場合です。ADO.NETは、APMモデル(BeginExecute / EndExecute)を使用した非同期操作を既に提供しています。TPLを使用してこれをタスクにラップし、プログラミングを簡素化できますが、パフォーマンスは向上しません。
問題がデータベース処理にまったく適していない可能性があります。アルゴリズムでデータセット全体を複数回スキャンする必要がある場合は、すべてのデータを一度に適切なファイル形式に抽出し、それを別のマシンに転送して処理することをお勧めします。