- PR -

SQLServer2000 ストアド内の検索処理が遅い

1
投稿者投稿内容
sig
会議室デビュー日: 2008/06/11
投稿数: 9
投稿日時: 2008-10-29 15:08
SQLServer2000のストアドプロシージャで困っています。

ストアド内で、カーソルを作るためにSELECT文を書いています。
管理テーブルと明細テーブルを結合して読んでいるのですが、データ量が多いために、その部分だけで約90秒かかっていました。
抽出条件として、管理テーブルにある売上日から今日の分を対象としています。

(SELECT句は省略)
FROM 管理 INNER JOIN 明細
ON 管理.管理 = 明細.管理
AND 管理.売上日 = 明細.売上日
WHERE 管理.売上日 = @Ymd ←(@Ymdはストアド起動時に渡すパラメータです。)

上記のSQLの高速化を狙い、管理.売上日にインデックスを貼りました。
結果、このSQLだけをクエリアナライザで実行したところ9秒に短縮されました。

しかし、ストアドを実行すると7分ほどかかるようになってしまいました。
調べたところ、上記のSQLを使ったカーソルを作成する部分で6分ほどかかっている結果となりました。

整理しますと、
1.インデックスを貼ったことにより遅かったSQLは、単体で実行すると速くなっている。

2.速くなっているはずのSQLを、ストアドプロシージャ内で実行すると遅くなっている。

3.ストアドプロシージャ内はインデックスが邪魔になる?

となりました。

ストアドプロシージャ内でインデックスが障害になるケースって、何が原因で起こるものなのでしょうか?

尚、SQLをクエリアナライザで実行したときの実行プランには、正常なインデックスを使っている表示はでました。

どなたか同じようなケースに出会った方はいらっしゃいませんでしょうか?
よろしくお願い致します。
dodo
ベテラン
会議室デビュー日: 2004/05/12
投稿数: 99
お住まい・勤務地: 東京都渋谷区
投稿日時: 2008-10-29 16:05
引用:

sigさんの書き込み (2008-10-29 15:08) より:

ストアドプロシージャ内でインデックスが障害になるケースって、何が原因で起こるものなのでしょうか?



"ストアド 実行計画"で検索したら、以下のスレッドが見つかりました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38608&forum=7&start=0
引用:

ストアドの実行時間は、
1.適切な実行計画のキャッシュが存在する
2.実行計画のキャッシュが存在しない
3.不適切な実行計画のキャッシュが存在する
←速い 1<2<<<<<<<<<<3 遅い→
となり3の場合、極端にレスポンスが悪化することがあります。



あとこちらも参考になるかと。
http://support.microsoft.com/kb/401920/ja
引用:

インデックスの追加や統計情報の更新を行ってもスキーマは更新されないことに注意してください。これらのアクションは、新しい実行計画を強制的に作成するわけではありません。プロシージャを WITH RECOMPILE コマンドを指定して実行するか、
RECOMPILE コマンドオプションを付けて作成しない限り、キャッシュ内の既存の計画が使用され続けます。

sig
会議室デビュー日: 2008/06/11
投稿数: 9
投稿日時: 2008-10-30 16:57
引用:

dodoさんの書き込み (2008-10-29 16:05) より:

"ストアド 実行計画"で検索したら、以下のスレッドが見つかりました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38608&forum=7&start=0

あとこちらも参考になるかと。
http://support.microsoft.com/kb/401920/ja



>dodoさん
ありがとうございます。
リンク先を参考にしましたが変わらなかったです。
ただ、近いような気はします。
1度実行した後、続けて同じストアドを実行すると段違いに速くなっています。

この実行計画をいつも持っていれば良いのですが…
1

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