- - PR -
FETCH時に毎回TBLを参照しにいく
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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して返すといった内容です。 長々と記述してしましたが、よろしくお願いいたします。 |
|
投稿日時: 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