2009-05-27 3 views
6

私は処理するために50万行以上を返すSqlクエリを持っています...プロセスは本当に長くはかかりませんが、私はいくつかのマルチプロセッシングで少し高速化したいと思います。以下のコードを考慮すると、そのようなものをマルチスレッド化することは可能でしょうか?SqlDataReaderをマルチスレッドする方法はありますか?

using (SqlDataReader reader = command.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     // ...process row 
    } 
} 

結果のリストの先頭と真ん中にカーソルを置くだけで問題はありません。そうすれば、私はレコードを処理する2つのスレッドを持つことができます。しかし、SqlDataReaderは私にそれを許可しません...

どのように私はそれを達成することができますか?

+0

クエリを分割する方法が分かっている場合は、2つのクエリを並行して実行できます。 – VVS

答えて

6

プロデューサ/コンシューマキューを設定し、1つのプロデューサプロセスでリーダーとキューレコードをできるだけ早くプルしますが、処理は行いません。次に、キューに登録されている各レコードをデキューして処理するために、必要なプロセス数(システムに依存する数)を指定します。

+0

Hmm ..奇妙ですが、私はジェネリックプロデューサー/コンシューマーパターンが既に実装されているのを見つけることができませんでした。私自身のもので遊んでいますが、ここに入力していただければ幸いです。http://stackoverflow.com/questions/916863/generic-net-produce-consumer –

0

WHERE IDのように、1から500000までの簡単なレンジクエリですか?もしそうなら、それぞれが1/Nの範囲を返すN個のクエリをキックオフすることができます。しかし、シングルスレッドアプローチでボトルネックになっている場所を知ることができます。 1つのディスクスピンドルから連続して読み込みを行ってクエリを実行する場合は、おそらく単一のスレッドに固執する必要があります。ある範囲でスピンドルに分割されている場合は、ディスクからのスループットを最大限にするためにクエリをインテリジェントにチューニングすることができます(つまり、各ディスクから個別のクエリと並行して読み取る)。すべての行がメモリに格納されることを期待している場合は、自由に並列化できます。しかし、クエリがより複雑な場合は、大量のオーバーヘッドが発生することなく簡単にパーティションを分割することができない場合があります。ほとんどの場合、上記のオプションはうまく適用されず、Joelが言及したプロデューサ/コンシューマだけが並列化する場所になります。各行の処理にどれくらいの時間を費やしているかによって、これはほんの些細なものにすぎません。

3

クライアント上の多くの行を読み取るべきではありません。

つまり、クエリを複数のクエリに分割し、並列に実行することができます。これは、複数のSqlCommandsを別々のスレッドで起動し、それぞれに結果のパーティションをチャーンさせることを意味します。 A +の質問は、結果を分割する方法であり、これはあなたのデータoを大きく依存し、問合せ:

  1. あなたはキーの範囲を使用することができます
  2. あなたが属性を使用することができます(例えばID betweem 1 and 10000ID between 10001 and 20000など。) (例えば。RecordTypeID IN (1,2)RecordTypeID IN (3,4)など)
  3. あなたは、合成範囲(すなわち。ROW_NUMBER() BETWEEN 1 and 1000など)を使用することができますが、これはあなたが(例えばBINARY_CHECKSUM(*)%10 == 0BINARY_CHECKSUM(*)%10==1など)のハッシュを使用することができます
  4. 右のプルすることは非常に問題がある

実行中にパーティションクエリが重複しないようにし、ブロックに注意してください。同じレコードをスキャンしてXロックを取得する)、相互に直列化します。

+0

これはとても良いアイデアだとは思わない - 開発者はデータ(または将来のように見えるもの)についてこれについて多くを知ってください。さらに、他のシナリオではすべてのソリューションを再利用する必要があります。純粋なマルチスレッドソリューションは、上記のプロデューサ/コンシューマのように最適です。 –

関連する問題