fc2ブログ
 

Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


2010年06月14日

カーソルループの高速化(1)

前々回、「ループ処理内で連番を振る」テーマについて書いたのですが、
「カーソルループ自体を高速化したい」という要望があったりします。
処理ロジックは変えたくない、でも速くしたい。
問題の本質は、多くの場合、性能試験がシステムテストの一部になっていることでしょう。
システムテストに入る時点で機能テストは終わっているわけですから、
処理ロジックは変えたくない、という意識が働くのはあたりまえのことです。
しかし、性能問題が発現した場合、その多くは「処理ロジックの大幅変更」を
伴うことが多いものです。

今回はカーソルループを残したままでの高速化を考えた場合、
どういう方法があるのか?ということで、「ループ処理を可能な限り排除する」という
本来の高速化の指針から言えば、少々例外的なトピックになってしまいますが・・・。
もちろん、大幅な変更ではないにしろ、ある程度の変更は必要になります。

カーソルループの処理を高速化するのに一番最初に浮かぶのは
カーソル自体を速くできないか?ということです。
T-SQLのカーソルにはいろいろなオプションがありますが、
あまり効果は期待薄。・・・。強いて言うなら、カーソル属性をreadonly にせず、
current of を使って更新するようなロジックを組むこと。
ま、これはカーソル対象テーブルを更新する場合とかにしか使えませんが。

declare cursor curTest
select
a,b,c
from
tableA

open curTest

fetch next from curTest into @a,@b,@c

while (@@fetch_status = 0)
begin

・・・・

update
tableA
set
c = c * 1
where current of cueTest

fetch next from curTest into @a,@b,@c

end

close curTest
deallocate curTest

あとはループのなかで行われているSQL文の最適化。
インデックスを試したり、実行プランを解析してjoin の条件順序の変更や
ヒントを付与したりして調整していくのですが、
多くの場合、なかなか性能は上がらないものです。

では、これ以上、何ができるのか?次回。

[ posted by H.K ]

この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/478-9c7710ac
この記事にトラックバックする(FC2ブログユーザー)