sql >> Databáze >  >> RDS >> Oracle

Pomalý výkon na Hibernate + Java, ale rychlý, když používám TOAD se stejným nativním dotazem Oracle

Myslím, že co se děje s tímto kódem:

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

je toto:

na řádku 1:plán dotazů je vytvořen na základě některých očekávaných hodnot pro vaše pojmenované parametry.

na řádku 4:dotaz se provede s hodnotou1 a hodnotou2, ale tyto hodnoty nejsou "dobré hodnoty" pro plán dotazů, který byl propracován na řádku 1, takže databáze provádí velmi nevhodný plán pro skutečné hodnoty a trvá to hodně času.

Proč?

Podívejte se na zdrojový kód HibernateSessionImpl.createSQLQuery(...) Našel jsem tento řádek kódu:

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

což volá getQueryPlanCache() s nějakým parametremMetaData. Předpokládám, že tato metadata nejsou dost dobrá .



  1. Průvodce automatizací databází s několikanines ClusterControl

  2. Jak zachovat připojení k databázi na webovém serveru python

  3. Parametr s hodnotou tabulky v uložené proceduře a Entity Framework 4.0

  4. Jak zapsat UPDATE SQL s aliasem tabulky v SQL Server 2008?