2016-04-26 17 views
0

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分の大きなクエリもあります。

+0

両方のクエリについて実行計画は何を示していますか?使用しているOracleデータベースのバージョンは? (また、SQL Developerでは、 'variable'コマンドと無名ブロックを使用して、スクリプトの一部としてバインド値を設定することができます。プロンプトで入力しないようにしたい場合) –

+0

" Parameter Sniffing " - より多くを見つけるために検索を行います。 – Hogan

答えて

1

ここで興味深いテストがあります:ちょうど楽しみのために、バインド変数の名前を変更してください(たとえば、x、y、zと呼んでください)。変数。クエリを実行する最初の時間は、それ以外のすべてが等しい場合(それは決してありません)、2番目のクエリと同じくらい長くかかるはずです。

バインド変数を使用する利点の1つは、クエリが1回だけ解析されることです。エンジンはまだクエリを実行する必要がありますが、クエリの解釈、最適化などのオーバーヘッドが回避されます。技術用語は「ソフト解析」と「ハード解析」です。これに関する良い読書:

https://blogs.oracle.com/sql/entry/improve_sql_query_performance_by

関連する問題