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

Langsom ydeevne på Hibernate + Java, men hurtig, når jeg bruger TOAD med den samme oprindelige Oracle-forespørgsel

Jeg tror, ​​hvad der sker med denne kode :

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

er dette:

på linje 1 :Der oprettes en forespørgselsplan baseret på nogle forventede værdier for dine navngivne parametre.

på linje 4:forespørgslen udføres med værdi1 og værdi2, men disse værdier er ikke "gode værdier" for forespørgselsplanen, der var udførlig på linje 1, og så udfører databasen en meget upassende plan for de faktiske værdier, og det tager meget tid.

Hvorfor?

Ser på kildekoden til HibernateSessionImpl.createSQLQuery(...) Jeg fandt denne kodelinje:

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

som kalder getQueryPlanCache() med nogle parameterMetaData. Jeg går ud fra, at disse metadata ikke er gode nok .



  1. Opret Spark Dataframe fra SQL Query

  2. MySQL fremmednøgle for at tillade NULL?

  3. ValueError:Kan ikke tilføje *:forekomst er på databasestandard, værdi er på database Ingen

  4. Hvordan kan jeg få MySQL-log til at planlægge begivenheder?