Oracle db に対して Web アプリケーションの休止状態の基準に時間がかかりすぎます。log4j.logger.org.hibernate.SQL=debug SQL を有効にし、sql で同じバインド変数を使用して sql クエリを実行し、結果はインスタンスです。休止状態のログを有効にしてログを調べます。hibernate がクエリをこするのに時間がかかりすぎる原因は何ですか? 助言がありますか?
更新 1:
休止状態が生成する同じクエリを SQLPlus で実行すると、オラクルは異なる実行計画を使用するようです。Hibernate からの SQL クエリ:
select count(*) as y0_ from SUMMARY_VIEW this_ where this_.ser_id like :1 and this_.TYPE=:2 and this_.TIME_LOCAL>=:3 and this_.TIME_LOCAL<=:4
SQLPlus で実行される SQL クエリ:
select count(*) as y0_ from SUMMARY_VIEW this_ where this_.ser_id like :ser_id and this_.TYPE=:type and this_.TIME_LOCAL>=:startdate and this_.TIME_LOCAL<=:enddate
更新 2: さらなる調査により、その startdate および endate バインド変数が sqlplus から varchar2 として渡されたが、これらは app からタイムスタンプとして渡されたことが明らかになりました ( :) )。このため、実行計画は異なります。
select sql_text, v.sql_id, name, value_string, datatype_string from v$sql_bind_capture vbc join v$sql v using (hash_value) where v.sql_id in (?)
バインド変数の型は実行計画に影響しますか? もしそうなら、クエリへのバインドパラメータとして日付変数を渡す他のツールはありますか?
更新 3: 互換性のないデータ型によるパフォーマンスの問題。列のデータ型 (DATE) と休止状態のデータ型 (TIMESTAMP) の不一致により、暗黙的なデータ型変換が発生しているようです。Oracle は INTERNAL_FUNCTION を使用して日付列を転送し、渡されたバインド変数の hibernate データ型 TimeStamp と一致させます。
同様の問題: