質問

楽しみのために私は内蔵のヒキガエルでOracleのオプティマイザ今日で演奏されて。それは示唆して最適化の一つは次の通りである。

AND emp.pay_type = NVL('FT', UID)

の代わりに

AND emp.pay_type = 'FT'

私はここで何が起こっているかについて混乱し、それのために、これはパフォーマンスを改善する理由にも上の混乱しています。 FTは、SQLクエリ、したがって、決してNULL内の文字列リテラルであるので、なぜこれは何の違いになるだろうか?私はそれがフィールド上に既存のインデックスとは何かを持って推測するが、Oracleのドキュメントで何かを見つけることができませんよ。

役に立ちましたか?

解決

これは奇妙なアドバイスです。 NVL関数は次のように動作します:

NVL(exp1, val1)
「EXP1」はnullでない場合は、

は、それが返されます。それ以外の場合は 'VAL1' は返されます。

の例では「FT」はNULLにすることはできませんので、少なくともNVLが冗長であることが動作するようにオプティマイザNVL関数を使用することに何の利点、および小性能ペナルティが(存在しない、多分実行ペナルティオプティマイザならNVL)が冗長であることを動作しません。

条件が読んだらます:

AND emp.pay_type = NVL( "FT"、UID)

、その後の利益があるかもしれません。ここでは、区切られた識別子(二重引用符で囲まれた列名)を持ち、列の値は、おそらくNULLである可能性があります。 NULLは、 "FT" はNULL およびの場合にのみ返されることNVLコール性を保証UIDはNULLです。 UIDは、当然のことながら、定期的な識別子です。

:条件が読めば、

これは意味をなさないかもしれません

AND emp.pay_type = NVL(UID, 'FT')

次にUID値がNULLの場合、デフォルト値「FT」は、対応するpay_typeとして使用されます。

他のヒント

私は塩の巨大粒でヒキガエルの「最適化の提案を」取ると思います。 )

:どういうわけか、ターゲットで異なるビットの全体の多く撮影し、それらのいずれかが当たるかを確認 - 私は最適化の「ショットガン」メソッドと呼んで

とにかく、

との違い
AND emp.pay_type = NVL('FT', UID)

AND emp.pay_type = 'FT'
(それらが集まってきた場合)は、第2のケースでは、オプティマイザが一致した行数のより正確な推定値を得るために、カラムのヒストグラム統計を使用することです。 NVLを使用する場合は、しかし、オプティマイザは、(私は信じている)、それはNVLを無視することができることを検出しませんので、値のヒストグラムをチェックしません。

これは、私が一般的に使用する最適化手法ではありません。 (例えば、ヒント、)クエリの実行パスを制御するためのより良い方法があります。それらはNVL([literal value],[anything])[literal value]等の外観と最適化冗長コードにCBOを向上させる場合、特に、この方法は失敗するだろう。

Oracleのプランは、2つのクエリをご紹介何を説明していますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top