Oracle
 sql >> Database >  >> RDS >> Oracle

Prestazioni lente su Hibernate + Java ma veloci quando utilizzo TOAD con la stessa query Oracle nativa

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 .