Oracle
 sql >> Base de données >  >> RDS >> Oracle

Performances lentes sur Hibernate + Java mais rapides lorsque j'utilise TOAD avec la même requête Oracle native

Je pense que ce qui se passe avec ce code :

SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult(); 

est-ce :

à la ligne 1 :un plan de requête est créé en fonction de certaines valeurs attendues pour vos paramètres nommés.

à la ligne 4 :la requête est exécutée avec valeur1 et valeur2, mais ces valeurs ne sont pas de "bonnes valeurs" pour le plan de requête qui a été élaboré à la ligne 1 et donc, la base de données exécute un plan très inapproprié pour les valeurs réelles et il faut beaucoup de temps.

Pourquoi ?

En regardant le code source de HibernateSessionImpl.createSQLQuery(...) J'ai trouvé cette ligne de code :

SQLQueryImpl query = new SQLQueryImpl(
                sql,
                        this,
                        factory.getQueryPlanCache().getSQLParameterMetadata( sql )
        );

qui appelle getQueryPlanCache() avec quelques paramètresMetaData. Je suppose que ces métadonnées ne sont pas assez bonnes .