Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Langsame Leistung bei Hibernate + Java, aber schnell, wenn ich TOAD mit derselben nativen Oracle-Abfrage verwende

Ich denke, was mit diesem Code passiert:

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

ist das:

in Zeile 1:Ein Abfrageplan wird basierend auf einigen erwarteten Werten für Ihre benannten Parameter erstellt.

in Zeile 4:Die Abfrage wird mit value1 und value2 ausgeführt, aber diese Werte sind keine "guten Werte" für den Abfrageplan, der in Zeile 1 ausgearbeitet wurde, und daher führt die Datenbank einen sehr ungeeigneten Plan für die tatsächlichen Werte aus und es dauert viel Zeit.

Warum?

Blick auf den Quellcode von HibernateSessionImpl.createSQLQuery(...) Ich habe diese Codezeile gefunden:

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

die getQueryPlanCache() aufruft mit einigen parameterMetaData. Ich gehe davon aus, dass diese Metadaten nicht gut genug sind .