2012-02-14 10 views
0

のSQL DECODEの最適化

ta.COD_ACT_MCH= ALIMENTATION_COD_ACT_MCH(ta.CA_DDE_TYP_DDE,tb.COD_SECVTE,tb.NUM_FOU1,ta.CA_COD_ENSCIAL) 

が、これはそれを行うための方法ですか?それとも、関数を2回呼び出すか?これをどのように最適化できますか?

ta.COD_ACT_MCH=DECODE(ALIMENTATION_COD_ACT_MCH(ta.CA_DDE_TYP_DDE,tb.COD_SECVTE,tb.NUM_FOU1,ta.CA_COD_ENSCIAL), 
'N', 
' ', 
ALIMENTATION_COD_ACT_MCH(ta.CA_DDE_TYP_DDE,tb.COD_SECVTE,tb.NUM_FOU1,ta.CA_COD_ENSCIAL)) 

答えて

0

このハックは動作します:

NVL(NULLIF(
    ALIMENTATION_COD_ACT_MCH(ta.CA_DDE_TYP_DDE,tb.COD_SECVTE,tb.NUM_FOU1,ta.CA_COD_ENSCIAL), 
    'N'), '') 
+0

Oracleでは、空の文字列はnullと評価されるため、 'NVL(whatever、 '')'は無駄です。 – Allan

1

DETERMINISTIC/RESULT CACHE句を関数ALIMENTATION_COD_ACT_MCHに追加します。したがって、selectリストで2回以上使用することは可能ですが、oracleは関数の結果を1回だけ計算することになります。 ALIMENTATION_COD_ACT_MCHNULLを返すことができない限り、

+0

RESULT_CACHEは11グラムで動作します。 10倍。 – Samson

+0

関数が実際に確定的である場合にのみ、 'DETERMINISTIC'を追加してください。そうでない場合(たとえば、テーブル内の値を参照している場合)、不正確な結果が得られる可能性があります。 – Allan