none
declare cursor関数について RRS feed

  • 質問

  • ご教授願います。
     
     現在システム開発で
     若気の至りというか上級者ぶって
     declare cursorを使用したストアドを
     作成しました。

     しかし、いざ納品し稼働していくと
     3000件ほどのレコードの集計を行うプログラムでも
     10~20分かかってしまいました。

     それで、ネット等を見てみると
     declare cursorは使用しない方がいいと書いてありました。

     いまさら変更となると厳しいので
     declare cursorを使用して少しでも早く処理する記述方法が
     ありましたらお願い致します。

     現在、全てに
     declare #名前 cursor for select・・・と記述しています。

      ネットを見ると
     declare #名前 cursor *** for select ・・・の「***」を
     記述すればいいとあったのですが、最適な記述がありました
     ご回答お願いいたします。

     以上

    2012年2月22日 5:06

回答

  • ストアド内で他のストアドを呼んでいるということですが、その呼んだストアド内でもループで処理されているのでしょうか?一般的にループで処理する場合、速度は期待できません。もちろんループ以外のところ、例えばデータ処理自体で時間がかかっている可能性も否定できませんが、ループが多重になっている場合、そこで時間がかかっている可能性が大きいと思います。
    可能であれば、試しにループを使わないバージョンのストアドプロシージャを作成されて、テストされると良いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク zeak01 2012年2月29日 7:31
    2012年2月23日 8:51

すべての返信

  • cursorを使えばループして処理することになりますから、できるだけ使わない方が良いというのは確かだと思います。そのループの中でどのような処理をされているかですが、そこを工夫することによって処理時間が短くなる余地があるかもしれません。

     declare #名前 cursor *** for select ・・・の「***」を
     記述すればいいとあったのですが、最適な記述がありました
     ご回答お願いいたします。

    条件が合えば、LOCAL FAST_FORWARDを指定されてみてはいかがでしょうか?

    (参考)
    SQL 2005: How to set a fast cursor? Faster than FAST_FORWARD?
    http://dbaspot.com/sqlserver-programming/199342-sql-2005-how-set-fast-cursor-faster-than-fast_forward.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年2月22日 5:29
  •  ご回答ありがとうございます。

     設定してみたいと思います。

     また、declare・・・をwhile関数に変えて行ってみましたが 

     処理時間は変わりませんでした。

     変更したストアドはさらに違うストアドに飛ぶ記述をしています。

     このとんだ先もdeclare・・・からwhileにしたのですが

     1分ほど早くなった程度です。 

     こういうものなのでしょうか?

    2012年2月22日 8:06
  • ストアド内で他のストアドを呼んでいるということですが、その呼んだストアド内でもループで処理されているのでしょうか?一般的にループで処理する場合、速度は期待できません。もちろんループ以外のところ、例えばデータ処理自体で時間がかかっている可能性も否定できませんが、ループが多重になっている場合、そこで時間がかかっている可能性が大きいと思います。
    可能であれば、試しにループを使わないバージョンのストアドプロシージャを作成されて、テストされると良いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク zeak01 2012年2月29日 7:31
    2012年2月23日 8:51