Ik denk wat er met deze code gebeurt:
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
is dit:
op regel 1:er wordt een queryplan gemaakt op basis van enkele verwachte waarden voor uw benoemde parameters.
op regel 4:de query wordt uitgevoerd met waarde1 en waarde2, maar die waarden zijn geen "goede waarden" voor het queryplan dat op regel 1 werd uitgewerkt en dus voert de database een zeer ongepast plan uit voor de werkelijke waarden en het duurt veel tijd.
Waarom?
Kijkend naar de broncode van HibernateSessionImpl.createSQLQuery(...)
Ik heb deze regel code gevonden:
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
die getQueryPlanCache()
. aanroept met een aantal parameterMetaData. Ik neem aan dat deze metadata niet goed genoeg is .