Jag tror vad som händer med den här koden :
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
är detta:
på rad 1 :en frågeplan skapas baserat på några förväntade värden för dina namngivna parametrar.
på rad 4 :frågan exekveras med värde1 och värde2, men dessa värden är inte "bra värden" för frågeplanen som var utarbetad på rad 1 och så, databasen kör en mycket olämplig plan för de faktiska värdena och det tar mycket tid.
Varför?
Tittar på källkoden för HibernateSessionImpl.createSQLQuery(...)
Jag hittade denna kodrad:
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
som anropar getQueryPlanCache()
med någon parameterMetaData. Jag antar att denna metadata inte är tillräckligt bra .