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á .