• ベストアンサー

ストアドプロシージャの多用でパフォーマンスは向上するか?

抽象的な話で非常に恐縮なのですが、 ストアドの中で行うSELECTやINSERTなどの処理を 更にストアドにすることで、パフォーマンスは向上するのでしょうか? たとえば、「テーブルAの内容を取得してテーブルBにINSERT」というストアドがあったとします。 この場合、以下のような記述になると思います。 ---------------------------------- SELECT (略) FROM TBL_A INSERT INTO TBL_B (略) ---------------------------------- このSELECT及びINSERT処理をそれぞれストアド化し、 ---------------------------------- EXEC SP_A (略) EXEC SP_B (略) ---------------------------------- とすると、わずかなりでも処理速度は向上するのでしょうか? (極論ですが、全てのSELECT、INSERT、UPDATEをストアド化するのがベストなのでしょうか?) 現在、数百万~数千万件のレコードを処理するストアドを作成中で、処理時間の短縮が大きな課題になっています。 1件あたりの処理が0.1秒でも縮めば、10万件の処理時間は10,000秒(=3時間弱)の短縮になり、決して馬鹿にはできません。 妙な質問ですが、良策があればご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

あ、ちょっと読み間違いしてました。 ストアドの中の処理を更にサブプロシージャにするということなんですね。 それだと、メンテナンスの面では意味があると思いますけど、処理スピードを上げるという意味では疑問に思います。サブプロシージャの呼び出しのオーバーヘッドがあると思うので、サブプロシージャにしない場合に比べて、少し遅くなるんじゃないかと推測します。

その他の回答 (2)

  • driverII
  • ベストアンサー率27% (248/913)
回答No.2

SQL Serverのストアドの経験はありますが、 このケース(ストアドの中のストアド)は初めてなので一般人で回答します。 で、ご質問ですが、あまり意味がないと思われます。 インデックスのつけ方や、SQLの見直し、 たとえば不要なレコードを処理対象からはずす などを進めたほうが良いのではないでしょうか。 もしどうしてもというのであれば、テストPGを 作成し、実行時間を測定するしかありませんね。

Laphroaig
質問者

お礼

有難うございます。 確かに、インデックスやクエリ文の見直しで改善するところもありました。 どうやら、修行が足りないようです…。

回答No.1

ストアドにすれば、多少は速くなるような気はします。 ストアドじゃなくて、1回1回SQLを発行すると、SQL-Server は SQL を受け取る度に SQL の構文解釈をしてコンパイルすると思うんですけど、ストアドにしておけば、1回1回、構文解釈する必要がないですからね。 あと、SQL-Server は INSERT INTO ~ SELECT ~ FROM ~ の構文は使えないんでしょうか? SELECT と INSERT を別々の SQL 文にするより、こっちの方が効率がいいと思います。

Laphroaig
質問者

お礼

有難うございます。 同じようなことをしている個所がいくつもあったので、 それをストアド化することにしました。メンテナンスも簡単になりますしね。 ちなみに、SELECTとINSERTはあくまで例であり、実際に行っているわけではないので悪しからず。