Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Desempenho lento no Hibernate + Java, mas rápido quando uso o TOAD com a mesma consulta nativa do Oracle


Eu acho que o que está acontecendo com este código:
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult(); 

é isto:

na linha 1 :um plano de consulta é criado com base em alguns valores esperados para seus parâmetros nomeados.

na linha 4 :a consulta é executada com valor1 e valor2, mas esses valores não são "bons valores" para o plano de consulta que foi elaborado na linha 1 e assim, o banco de dados está executando um plano muito inadequado para os valores reais e demora muito tempo.

Por quê?

Observando o código-fonte de HibernateSessionImpl.createSQLQuery(...) Encontrei esta linha de código:
SQLQueryImpl query = new SQLQueryImpl(
                sql,
                        this,
                        factory.getQueryPlanCache().getSQLParameterMetadata( sql )
        );

que está chamando getQueryPlanCache() com algum parâmetroMetaData. Presumo que esses metadados não sejam bons o suficiente .