SQL Developerを使用してクエリを実行し、:type
などのバインド変数を使用すると、使用する値の入力が求められ、バインド変数を固定値リテラル値、たとえば'A'
例えばクエリがSQL Developerでパラメータなしで遅く実行される
速い第二のクエリより実行最初のクエリ:
最初のクエリは
select DMDUNIT, LOC, SUM(QTY)
from hist
where dmdunit = :lv_dmdunit and type = :lv_type and loc = :lv_loc
and startdate >= sysdate - 40
GROUP BY DMDUNIT,LOC
2番目のクエリ(実行1.7秒)
select DMDUNIT, LOC, SUM(QTY)
from hist
where dmdunit = 'PROD_1' and type = 'A' and loc = 'B101'
and startdate >= sysdate - 40
GROUP BY DMDUNIT,LOC
理由(0.5秒を実行します)最初のクエリは2番目のクエリより速く実行されますか? 2番目のクエリを最初のクエリと同じ速さで実行するには、どのような手順が必要ですか?
これは小さなクエリで、それほど大きな違いはありませんが、同じクエリ(paramsとnon-params)の違いが10〜15分の大きなクエリもあります。
両方のクエリについて実行計画は何を示していますか?使用しているOracleデータベースのバージョンは? (また、SQL Developerでは、 'variable'コマンドと無名ブロックを使用して、スクリプトの一部としてバインド値を設定することができます。プロンプトで入力しないようにしたい場合) –
" Parameter Sniffing " - より多くを見つけるために検索を行います。 – Hogan