2009-07-29 5 views
1

大きな変換ジョブ - 299GbのJPEGイメージが既にデータベースにあり、レポートと帯域幅の目的で縮小イメージに相当します。SQLサーバーと並列(または挿入)並列

私は、スレッドセーフなSQLCLR関数を書いて、イメージを素早く再サンプリングするという仕事をしました。

UPDATEステートメント(PhotoDataフィールドからThumbDataフィールドまで)で問題を実行すると、競合状態を防止するために1つのプロセッサのみを使用してイメージをリサンプリングします。

このデータベースマシンに搭載されている12コアとphat raidの設定をどのように活用すればよいでしょうか?更新ステートメントのFROM句にサブクエリを使用していますか?この種の操作で並列処理を有効にするために必要なのはこれだけですか?

とにかく、操作はバッチに分割されます(バッチあたり約4000画像、約391k画像のウィンドウクエリ)、このマシンには多くのリソースがあります。

+1

SQL Serverのバージョンとエディションは何ですか? –

+0

2008エンタープライズ64ビット - 現在すべての論理プロセッサにバインドされていますが、奇妙なことに、最大並列度は現在ゼロ(使用可能なすべてのプロセッサが使用されています)に設定されています。 多分、並列クエリを書く方法は...私はhttp://sqlserverpedia.com/wiki/Parallel_Query_Processing#Insert.2C_Update.2C_Delete_Operationsで回答を見つけたと思います – Rabid

答えて

1

私は、kragen2ukとonupdatecascadeが主張する「ラウンドロビン」方法論も推奨します(私はそれらを投票しています)。私はCLRのルーチンとSQLのパラレル化に関して何か気になるものを読んだことは分かっていますが、今のところは忘れてしまいました...しかし、彼らはうまくいっていないと思います。

これまで同様の作業を行ってきたことは、作業の各バッチを一覧表示するテーブルを設定することでした。起動する各接続ごとに、このテーブルに移動し、次のバッチを調べ、処理中であるとマークし、処理し、完了として更新して繰り返します。これにより、パフォーマンスを測定し、スケーリングを管理し、最初からやり直すことなく停止と再起動を可能にし、タスクがどれほど完璧であるかを示すものを提供します。

+0

それは良いテクニックです。私はグローバルテンポラリテーブルでそれをやったことがあります(さらに、トランザクションを使ってテーブルからローをフェッチするので、あるスレッドが別のスレッドによって既に処理されているローをピックアップできません) – onupdatecascade

+0

私は、並列環境内で動作するSQL CLR関数のリファレンスは何も見つけられていません - 私はそれが安全な賭けであり、それがただのものだと想像したいと思います。 間違いなく良いアプローチです。 – Rabid

+0

サブクエリを試しましたが、並列に動作していないようです。あなたのソリューションは最もエレガントですが、私は他の人に考えを示すように指摘しました。私はすでにデータを1回変換しています(26時間かかりました)、私はテストを通して誤ったアラームが発生したため、再度変換する必要があると考えました。 – Rabid

2

SQL Serverの最大並列度(MAXDOP)の構成設定を確認してください。 MAXDOPの値を設定することもできます。

このリンクはhttp://www.mssqltips.com/tip.asp?tip=1047

歓声

+0

ありがとう、サーバーは可能な最大並列性。 – Rabid

2

あなたがバッチにクエリを分割し、別々の接続で個別に各バッチを実行できませんでしたあなたに役に立つかもしれませんか? SQL Serverは、クエリの中で並列性を使用していますが、並列化オプションのコストのしきい値をOに変更することによって、SQL Serverを停止したり、少しでも奨励したりできますが、かなりヒットしてしまいます。

注目すべき点の1つは、クエリのコンパイル時に並列性を使用するかどうかを決定することだけです。また、CPUの負荷が高いときにクエリをコンパイルすると、SQLサーバは並列性を考慮しにくくなります。

+0

私はこの解決策に出くわしましたが、現在のシナリオでは最終的には実際的ではありません。これは単なるオフであり、管理スタジオを通じて実行されます。 – Rabid

2

セットを異なるサブセットの行(1-100,101-200、何でも)に分割し、同時に複数の接続から更新ステートメントを呼び出して、各接続が表の行。すべての接続は並行して実行する必要があります。

関連する問題