質問

既にデータベースにある299GbのJPEG画像を、レポートおよび帯域幅の目的で同等のサムネイルに変換する大きな変換ジョブを取得しました。

画像を再サンプリングする仕事をするスレッドセーフなSQLCLR関数を作成しました。すばらしい仕事です。

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

では、このデータベースマシンに搭載されている12のコアとファットレイドのセットアップをどのように活用すればよいでしょうか? updateステートメントの FROM 句でサブクエリを使用するのですか?この種の操作で並列処理を有効にするために必要なのはこれだけですか?

操作はバッチに分割されますが、バッチあたり約4000個の画像(約391k個の画像のウィンドウクエリ)で、このマシンには十分な書き込みリソースがあります。

役に立ちましたか?

解決

「ラウンドロビン」もお勧めします。 kragen2ukとonupdatecascadeが提唱する方法論(私は投票しています)。 CLRルーチンとSQL並列処理についていらいらするものを読んだことは知っていますが、今のことを忘れています...しかし、それらは一緒にうまく機能しないと思います。

過去に同様のタスクで行ったことにより、実行する作業の各バッチをリストするテーブルを設定しました。起動する接続ごとに、このテーブルに移動し、次のバッチを取得し、処理中としてマークし、処理し、完了として更新して、繰り返します。これにより、パフォーマンスを測定し、スケーリングを管理し、最初からやり直すことなく停止と再起動を許可し、タスクがどの程度完了したかを示すことができます(実際に何かを実行していることを示すだけで)。

他のヒント

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

このリンクは役に立つかもしれません http://www.mssqltips.com/ tip.asp?tip = 1047

歓声

クエリをバッチに分割し、各バッチを個別の接続で個別に実行しませんか? SQLサーバーは、クエリで並列処理を使用しているように感じた場合にのみ使用し、並列処理オプションのコストしきい値をOに変更することでそれを停止したり、(少し)奨励することもできますが、かなりヒットとミスがあると思います。

注目に値することの1つは、クエリのコンパイル時にのみ並列処理を使用するかどうかを決定することです。また、CPU負荷が高いときにクエリがコンパイルされる場合、SQLサーバーは並列性を考慮する可能性が低くなります。

いくつかの基準を見つけて、セットを行の個別のサブセット(1-100、101-200など)に分割し、各接続が行のサブセットを処理する複数の接続から同時にupdateステートメントを呼び出しますテーブルに。すべての接続は並行して実行する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top