Jeg tror, hvad der sker med denne kode :
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
er dette:
på linje 1 :Der oprettes en forespørgselsplan baseret på nogle forventede værdier for dine navngivne parametre.
på linje 4:forespørgslen udføres med værdi1 og værdi2, men disse værdier er ikke "gode værdier" for forespørgselsplanen, der var udførlig på linje 1, og så udfører databasen en meget upassende plan for de faktiske værdier, og det tager meget tid.
Hvorfor?
Ser på kildekoden til HibernateSessionImpl.createSQLQuery(...)
Jeg fandt denne kodelinje:
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
som kalder getQueryPlanCache()
med nogle parameterMetaData. Jeg går ud fra, at disse metadata ikke er gode nok .