sql >> Database >  >> RDS >> Oracle

Trage prestaties op Hibernate + Java, maar snel wanneer ik TOAD gebruik met dezelfde native Oracle-query

Ik denk wat er met deze code gebeurt:

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

is dit:

op regel 1:er wordt een queryplan gemaakt op basis van enkele verwachte waarden voor uw benoemde parameters.

op regel 4:de query wordt uitgevoerd met waarde1 en waarde2, maar die waarden zijn geen "goede waarden" voor het queryplan dat op regel 1 werd uitgewerkt en dus voert de database een zeer ongepast plan uit voor de werkelijke waarden en het duurt veel tijd.

Waarom?

Kijkend naar de broncode van HibernateSessionImpl.createSQLQuery(...) Ik heb deze regel code gevonden:

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

die getQueryPlanCache() . aanroept met een aantal parameterMetaData. Ik neem aan dat deze metadata niet goed genoeg is .



  1. DAO.Recordset.Update resulteert in rekord lock

  2. Postgres - Hoe automatisch ST_SetSRID(ST_MakePoint(lng, lat), 4326) aanroepen op inserts?

  3. [A]Oracle.ManagedDataAccess.Client.OracleParameter kan niet worden gecast naar [B]Oracle.ManagedDataAccess.Client.OracleParameter

  4. hoe kan ik een back-up maken en de datum herstellen vanuit de mysql-database?