このコードで何が起こっていると思います:
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
これは:
1行目:名前付きパラメーターのいくつかの期待値に基づいてクエリプランが作成されます。
4行目:クエリはvalue1とvalue2で実行されますが、これらの値は1行目で作成されたクエリプランの「適切な値」ではないため、データベースは実際の値に対して非常に不適切なプランを実行しており、多くの時間。
理由?
HibernateSessionImpl.createSQLQuery(...)
のソースコードを見る このコード行を見つけました:
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
getQueryPlanCache()
を呼び出しています いくつかのparameterMetaDataを使用します。このメタデータは十分ではないと思います 。