- PR -

FETCH時に毎回TBLを参照しにいく

1
投稿者投稿内容
nabe
常連さん
会議室デビュー日: 2006/04/13
投稿数: 29
投稿日時: 2007-07-23 11:27
いつもお世話になっております。
SQL Server2005にて不可解な現象におちいり、
みなさんのお力をお借りしたく書き込まして頂きます。

SP_AとSP_Bという二つのストアドプロシージャー(以下SPと記述します)があるのですが、
この二つSPはある同じテーブル関数をカーソルにて読み込み、Fetch Nextにて
1行づつ処理をしています。

ところが、同じ入力元(テーブル関数)なのに、SP_AとSP_Bでは処理時間が全然違うのです。
トレースしてみたところ、
SP_Aでは、カーソルオープン時にテーブル関数を一度読み込んでいるのみなのですが、
SP_Bでは、カーソルオープン時とFetchするたびに、読み込んでいるようなのです。

SP_BもSP_Aのように、オープン時のみ読み込むようにしたいのですが、何がいけないのか
わかりません。
一体どうすればよいのでしょうか?

ちなみにSP_A、SP_Bのカーソルの宣言、オープンの仕方は同じです。
テーブル関数は実テーブルから@WrkTableにInsertしたデータを
ReturnTableにInsertして返すといった内容です。

長々と記述してしましたが、よろしくお願いいたします。

nabe
常連さん
会議室デビュー日: 2006/04/13
投稿数: 29
投稿日時: 2007-07-23 16:05
原因の特定ができましたので追記します。

大元の原因として、SP内で一時テーブルに対してのカーソル処理を行ったため
1行取得するタイミングで再コンパイルが発生していました。
ttp://support.microsoft.com/kb/243586/ja

SP_Aでは、一時テーブルに対して実テーブル結果を"UNION ALL"にて結合していたため
再コンパイルが発生せず、カーソルオープン時のみテーブルを取得していました。

SP_Bでは、一時テーブルのみに対してカーソル処理を行っていたため
再コンパイルが発生し何度もテーブルの取得が行われていました。

対処方法としてSP_Bに実テーブルから0行取得するSQLをUNION ALLで結合してみたところ
再コンパイルが発生しなくなりました。

今はこの方法でしのいでいますが、あまりスッキリしないので
良い対処方法がありましたら、ご教授のほどお願いいたします。


1

スキルアップ/キャリアアップ(JOB@IT)