- ベストアンサー
NVLとDECODEのスピード差
現在、ORACLE9iで開発していましてPLSQLの中で ある項目がヌルの時に他の項目とするような場合、 以下の2種類の関数で実現できるのですが どちらの使い方がスピードが速いのか知りたいのですがよろしくお願いします 1.DECODE(A,NULL,B,A) 2.NVL(A,B)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
普通に考えたらNVLだと思います。 DECODEは 1.関数の認識 2.値Aの一致性確認 3.置き換え文字の確認B の3ステップがかかりますが NVLは 1.関数の確認 2.値Aの一致性確認 だけで済みますから。 NVLよりDECODEがいいのであればNVLは存在意義がなくなります。しかし厳密な速さは違いがあるでしょうか 迷うことは杞憂かと思われます。(ほかのことを悩んだ方が良いでしょう) あとはコードの可読性ですね。 DECODEよりNVLの方が関数を見ただけで何がしたいのかすぐにわかるので可読性があがります。 よくDECODEを変換表のようにやたらめったら使っているSQLを見ますがあれを見るとプログラマの技術を疑います...
その他の回答 (1)
- entree
- ベストアンサー率55% (405/735)
どちらかと言われれば No.1 の方が回答されている通り NVL でしょうが、Oracle 9i で随分と SQL99 標準に対応してきているので、できれば、CASE 文を使われるのがベターだと思います。 CASE 文は不等号も使えるため、DECODE よりもさらにルーチンが複雑であり、遅いと思われますが、処理速度についてはどれも気にしなければならないほどではありません。 内部的には、DECODE、NVL、CASE 以外にも、IN を OR に書き換えたり、OR を UNION ALL に書き換えたりというような複雑な処理が行われることもあります。
お礼
確かにスピードに差が無ければCASE文のほうがSQL99準拠していてよいのかもしれません、ありがとうございました