2012-04-25 18 views
3

私はDECODEとNVLの機能のために内部的な作業がどのように行われているかを知りたがっています。 DECODE関数の引数の数が多い場合、DECODE関数のオーバーヘッドが増えますか?デコードとNVLの機能の違いは何ですか?

また、元の値がNULLでなくても、NVL関数はNULLの代わりに与えられた値を評価しますか? NVL(COL1、func_call()) の場合、COL1がNULLでなくてもfunc_call()が計算されます。その場合、COL1がまれにしかなく、func_call()が時間がかかる場合、パフォーマンスの問題が発生する可能性があります。事前に

おかげで

答えて

3

は、NVLは、常に両方の引数を評価し、そのCOL1がnullでない場合でも、それは

デコードが短絡しない()func_callを評価しますので、最初の有効な条件は、実行を停止します。

同様の引数を使用すると、パフォーマンスは2つの方法でかなり似ています。私は通常、if-then-else型の構造を必要としない限り、単純さに基づいてNVLを選択します。

---- EDIT ----あなた自身が見てみましょうNVL(COL1、汀(COL2、 '0'))のようなネストされたNVLをやって見つける場合は、NVLを使用しない状況で

coalesce(col1、col2、 '0') - 最初の非NULL引数を返します。

+0

ありがとうございます@Kelly。なぜ私はこの質問に尋ねたのです。なぜなら、クエリで複数のNVLまたはDECODEを使用する必要がある状況に直面する傾向があるからです。このような状況では、どの機能がパフォーマンスの面でより適していますか? – Rohan

+0

この場合、短絡するのでデコードを使用することがあります。 func_callに時間がかかる場合は、必要に応じて呼び出すほうがよいでしょう。また、NVLは本質的に短絡ではなく補完するほうが速いわけではありません。 – Kelly

+2

他のもの:nvl(col1、nvl(col2、 '0'))のようなネストされたNVLを実行している場合、NVLを使用する状況では、これがcoalesce(col1、 col2、 '0') - 最初のnullでない引数を返します。 – Kelly

関連する問題