1

私は大規模な変換ジョブを取得しました.299GbのJPEG画像はすでにデータベースにあり、レポートと帯域幅の目的で同等のサムネイルに変換しました。

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

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

では、このデータベース マシンが持つ 12 コアとファット RAID セットアップをどのように活用すればよいでしょうか? FROMupdate文の節でサブクエリを使うことですか?この種の操作で並列処理を有効にするために必要なのはこれだけですか?

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

4

4 に答える 4

2

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

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

于 2009-07-29T15:58:17.470 に答える
2

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

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

乾杯

于 2009-07-29T15:43:04.193 に答える
1

私も、kragen2ukとonupdatecascadeによって提唱されている「ラウンドロビン」方法論をお勧めします(私はそれらに投票しています)。CLRルーチンとSQLパラレリズムについて何か苛立たしいことを読んだことは知っていますが、それが今何であったかを忘れています...しかし、それらは一緒にうまく機能しないと思います。

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

于 2009-07-29T16:13:15.677 に答える
1

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

于 2009-07-29T16:04:46.600 に答える