- ベストアンサー
テーブル名が可変の動的SQLをファンクションにしたい
- Oracle9iのWindowsXP環境で、テーブル名が可変の動的SQLをファンクションにしたいです。
- 現在、同じようなselect文の繰り返しでレスポンスが悪いので、整理したいです。
- ファンクションにすることでコードを整理できるだけでなく、レスポンスも向上する可能性があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 >要はテーブル名が可変なファンクション 結局それを実現するのが、「EXECUTE IMMEDIATE」か「DBMS_SQL」を使う、と言う事になると思います。 >同じようなSELECT文が実際のコード上では20回以上 これを動的SQLでまとめたとしても、実際は違うSQL(テーブルが違うなら間違いなく違うSQLです)を発行しているので、その点では、ストアド化でパフォーマンスが大きく改善する事はないと思います。 動的SQLの場合、解析の時間も余計に食いますし。 解析の時間を減らす、と言う意味では、パラメータは、code, Table1のままにして、動的SQLではなくロジックでELSIFで冗長に判断する方がいいでしょうね。 それよりも、1つ1つの実行計画が良好なものであるなら、20発くらいの連投はパフォーマンスに大きな影響はないはずですよ。バッチ処理ならなおさらです。
その他の回答 (1)
- utakataXEX
- ベストアンサー率69% (711/1018)
そもそも、このファンクションは動的SQLになっていないですね。 ORACLEの動的SQLと言えば、「EXECUTE IMMEDIATE」か「DBMS_SQL」です。 (リンク参照ください) で、レスポンスですが、そもそも実行計画(プラン)は見ていますか? トレースを取ってみて、FULL SCAN や Disk Read が多発しているようなら、INDEXを張るとか、条件を見直すとかが必要になると思います。
お礼
ご回答ありがとうございます! まず、「動的SQL」という表現が良くなかったかもわかりません。要はテーブル名が可変なファンクションを作成したいだけなのです。 実行計画はまだ見ていませんが、そもそも同じようなSELECT文が実際のコード上では20回以上も発行されていますので、それをストアド化してレスポンスが下げられないものなのかなぁと思ってみたのです。 言葉足らずであったり、表現がまぎらわしくて申し訳ありませんでした。
お礼
ご回答ありがとうございます。 >>結局それを実現するのが、「EXECUTE IMMEDIATE」か「DBMS_SQL」を使う、と言う事になると思います。 EXECUTE IMMEDIATE ('SELECT *** FROM') || YYMM WHERE *** ; ということでしょうか? 確かにコンパイルは通ると思うのですが、これで結果は正しく返ってきましたでしょうか?ちょっと今試せる環境がないのですが・・ >これを動的SQLでまとめたとしても、実際は違うSQL(テーブルが違うなら間違いなく違うSQLです)を発行しているので、その点では、ストアド化でパフォーマンスが大きく改善する事はないと思います。 動的SQLの場合、解析の時間も余計に食いますし。 なるほど。。やはりそうですよね。。
補足
返事遅くなりましたが、EXECUTE IMMEDIATE で上手くいけました。 どうもありがとうございました。