Issue
I have a query which has 2 'in' Clauses. First in clause takes around 125 values and second in clause of query takes around 21000 values. Its implemented using JPA CriteriaBuilder
.
Query itself executes very fast and return results within seconds. Only problem is entityManager.createQuery(CriteriaQuery)
takes around 12-13 minutes to return.
I search all over SO, all the threads are related to performance of Query.getResultList
. None of them discuss about performance of entityManager.createQuery(CriteriaQuery)
. If you have seen such behavior earlier, please let me know, how to resolve it.
My JDK version is 1.7. Dependency version of javaee-api is 6.0. Application is deployed on JBOSS EAP 6.4. But that's not the concern as of now, as I am testing my code using junit using EntityManager
connected to actual Oracle database. If you require more information, kindly let me know.
Solution
I observed that, having single query with 21 IN clauses (each with 1000 expressions) and all combined with OR clauses, made query run slower. I tried another approach of executing every IN Clause as a part of separate query. So these 21 individual queries performed better overall.
Another issue I observed was that Query with CriteriaBuilder was slow when result set is huge (something like 20K rows in result set). I solved this issue by adding query hint to my typed query:
TypedQuery.setHint("org.hibernate.fetchSize", 5000);
Hope it will help others.
Answered By - user613114
Answer Checked By - Senaida (JavaFixing Volunteer)