sql >> Base de Datos >  >> RDS >> Oracle

Rendimiento lento en Hibernate + Java pero rápido cuando uso TOAD con la misma consulta nativa de Oracle

Creo que lo que está pasando con este código:

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

es esto:

en la línea 1:se crea un plan de consulta basado en algunos valores esperados para sus parámetros nombrados.

en la línea 4:la consulta se ejecuta con value1 y value2, pero esos valores no son "buenos valores" para el plan de consulta que se elaboró ​​en la línea 1 y, por lo tanto, la base de datos está ejecutando un plan muy inapropiado para los valores reales y toma mucho tiempo.

¿Por qué?

Mirando el código fuente de HibernateSessionImpl.createSQLQuery(...) Encontré esta línea de código:

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

que llama a getQueryPlanCache() con algún parámetroMetaData. Supongo que estos metadatos no son suficientemente buenos .