Penso a cosa sta succedendo con questo codice :
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
è questo:
alla riga 1:viene creato un piano di query basato su alcuni valori previsti per i parametri denominati.
alla riga 4:la query viene eseguita con value1 e value2, ma quei valori non sono "buoni valori" per il piano di query che è stato elaborato alla riga 1 e quindi, il database sta eseguendo un piano molto inappropriato per i valori effettivi e richiede molto tempo.
Perché?
Osservando il codice sorgente di HibernateSessionImpl.createSQLQuery(...)
Ho trovato questa riga di codice:
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
che sta chiamando getQueryPlanCache()
con alcuni parametriMetaData. Presumo che questi metadati non siano abbastanza buoni .