web-dev-qa-db-ja.com

内部カーソルのパフォーマンスの問題

しようとする前に カーソルの使用を避けてください パフォーマンスの問題のため。しかし今、私はいくつかの目標を達成するためにいくつかの計算をしなければなりません。次のようなコードを持つストアドプロシージャがあります。

DECLARE  Outer_Cursor CURSOR FOR...

   OPEN Outer_Cursor
   FETCH NEXT FROM Outer_Cursor INTO ...

   WHILE @@FETCH_STATUS = 0
   BEGIN

      DECLARE  Inner_Cursor CURSOR  FOR...

      OPEN Outer_Cursor
      FETCH NEXT FROM Inner_Cursor INTO ...

      WHILE @@FETCH_STATUS = 0
      BEGIN

        ...

        FETCH NEXT FROM Inner_Cursor INTO ...
      END

      CLOSE Inner_Cursor
      DEALLOCATE Inner_Cursor    

      FETCH NEXT FROM Outer_Cursor INTO ...

  END

  CLOSE Outer_Cursor
  DEALLOCATE Outer_Cursor

私の質問は、内部カーソルの非常に高価なカーソルの再作成を回避(最小化)することは可能ですか?内部カーソル宣言を再利用するにはどうすればよいですか?

ありがとうございました。

2
garik

内側のカーソルを使用する代わりに、外側のカーソルのすべてのステップでその作成と解放を回避したい場合は、一時テーブルを使用してデータをフェッチし、ステップごとに切り捨てることをお勧めします。

そうすれば、一度だけ作成でき、切り捨て操作はログに記録されないため、問題は発生しません。

PS:この状況では、各レコード(またはバッチ:-)に対してループされるID列を持つ一時テーブルを常に支持しています。しかし、私はコメントに同意します。問題をよりよく教えてください。別の解決策が見つかるかもしれません。

4
Marian