sql >> Databasteknik >  >> RDS >> Oracle

Långsam prestanda på Hibernate + Java men snabb när jag använder TOAD med samma inbyggda Oracle-fråga

Jag tror vad som händer med den här koden :

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

är detta:

på rad 1 :en frågeplan skapas baserat på några förväntade värden för dina namngivna parametrar.

på rad 4 :frågan exekveras med värde1 och värde2, men dessa värden är inte "bra värden" för frågeplanen som var utarbetad på rad 1 och så, databasen kör en mycket olämplig plan för de faktiska värdena och det tar mycket tid.

Varför?

Tittar på källkoden för HibernateSessionImpl.createSQLQuery(...) Jag hittade denna kodrad:

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

som anropar getQueryPlanCache() med någon parameterMetaData. Jag antar att denna metadata inte är tillräckligt bra .



  1. MySQL ger rader en livstid

  2. Hur man konverterar ett datum-/tidsvärde till en sträng i SQL Server med CONVERT()

  3. MySQL två kolumner tidsstämpel standardvärde NU FEL 1067

  4. GROUP BY returnerar den första posten