1

私が維持しているストアド プロシージャを最適化しようとしていますが、以下のオプションのパフォーマンスの利点/ペナルティについて誰かが私に手がかりを与えることができるかどうか疑問に思っています。私のソリューションでは、基本的に、テーブルの IMAGE 列に格納された画像に対して変換プログラムを実行する必要があります。変換プロセスは、外部の .EXE ファイルにあります。ここに私のオプションがあります:

  1. ターゲット テーブルの結果を一時テーブルにプルし、カーソルを使用してテーブルの各行に移動し、IMAGE 列に対してストアド プロシージャを実行します。ストアド プロシージャは、.EXE を呼び出します。

  2. .EXE ファイルを呼び出す UDF を作成し、「select UDFNAME(Image_Col) from TargetTable」のような SQL クエリを実行します。

私が探しているのは、カーソルをセットとして作成するのではなく、カーソルの作成によってどれだけのオーバーヘッドが追加されるかという考えだと思いますか?

いくつかの追加情報:

  • この場合のセットのサイズは最大です。1000
  • 以下の回答にあるように、UDFとセットで行うと、外部プログラムを一気に1000回開くということでしょうか?または、そのための最適化が行われていますか? 明らかに、マルチプロセッサ システムでは、プロセスの複数のインスタンスを実行することは悪いことではありませんが、1000 は少し多いかもしれません。
4

2 に答える 2

1

このコンテキストでセットベースを定義しますか?100行ある場合、これによりアプリが1回のショットで100回開きますか?テストと言いますが、UDFから拡張プロシージャを呼び出すことができるという理由だけで、テーブル内のデータを直接操作していないため、この場合はsetbasedは重要ではないため、カーソルを使用します。

于 2009-02-09T20:58:39.800 に答える
1

私は少しテストと実験を行いました.UDFで実行すると、実際に一度に各行を処理します-SQLサーバーは100行ごとに100プロセスを実行しません(そうなるとは思いませんでした)。

ただし、これをカーソルとしてではなく UDF として実行する方がよいと私はまだ信じています。なぜなら、私の調査では、カーソル内のデータを引き出す必要があるという余分なオーバーヘッドが処理速度を低下させることが示されているからです。大きな違いはないかもしれませんが、すべてのデータを最初に一時テーブルにプルするよりも時間を節約できます。

于 2009-02-10T16:40:49.997 に答える