Myślę, co się dzieje z tym kodem :
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
jest to:
w wierszu 1 :plan zapytania jest tworzony na podstawie niektórych oczekiwanych wartości dla nazwanych parametrów.
w linii 4 :zapytanie jest wykonywane z wartościami 1 i 2, ale te wartości nie są "dobrymi wartościami" dla planu zapytania, który został opracowany w linii 1, a więc baza danych wykonuje bardzo nieodpowiedni plan dla rzeczywistych wartości i zajmuje dużo czasu.
Dlaczego?
Patrząc na kod źródłowy HibernateSessionImpl.createSQLQuery(...)
Znalazłem ten wiersz kodu:
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
który wywołuje getQueryPlanCache()
z pewnymi parametramiMetaData. Zakładam, że te metadane nie są wystarczająco dobre .