Мне нужно использовать Hibernate и получать данные из Oracle, но проблема в том, что количество параметров, передаваемых в запрос, не всегда одинаково.
Для простоты рассмотрим следующий запрос:
выберите COL_1, COL_2, ..., COL_N из TAB_1, где COL_1 в (?,?, ...?)
Число параметров, переданных в предложении, находится в диапазоне от 1 до 500. Если число составляет около 1-50, оно работает довольно быстро, но для 200 требуется несколько секунд для выполнения запроса (разбор, создание плана объяснения, выполнение запрос). Индексы созданы и использованы - проверено.
Запрос создается динамически, поэтому я использую Hibernate Criteria API. Для первого запроса (с> 100 параметрами) это занимает 3-5 секунд, но для следующего запроса он работает быстрее (даже если количество параметров меняется). Я хотел бы улучшить время ответа на первый запрос. Что я могу сделать в этом случае, если Hibernate является обязательным?
Я подумал об удалении этого динамического запроса, создав несколько статических запросов в виде именованных запросов в файле XML (в этом случае эти запросы будут предварительно скомпилированы в начале). Например,
1) один запрос, если количество параметров меньше 50.
В этом случае, если у нас 30 параметров, запрос будет выглядеть так:
выберите COL_1, COL_2, ..., COL_N из TAB_1, где COL_1 in (PAR_1, PAR_2, ..., PAR_30, -1, -1, ..., -1?)
2) второй, если число находится в диапазоне от 50 до 100 и т. Д.
Проблема в том, что не так просто использовать именованные запросы и HQL (в JDBC это было бы просто). В HQL мы передали только список, и мы не указываем количество параметров в этом списке, т.е. фактически есть только один запрос
'from Person where id in (:person_list)'
myQuery.setParameterList("person_list", myList)
Есть ли возможность решить это?
Кстати, я думал, что план объяснения выполняется для каждого нового запроса, например:
(a) выберите COL_1, COL_2, ..., COL_N из TAB_1, где COL_1 в (?,?, ...,?) <100> - должен быть создан план объяснения
(b) выберите COL_1, COL_2, ..., COL_N из TAB_1, где COL_1 в (?,?, ...,?) <100> - план объяснения не будет создан, поскольку он уже существует в кэше
(c) выберите COL_1, COL_2, ..., COL_N из TAB_1, где COL_1 в (?,?, ...,?) <120> - должен быть создан план объяснения (для запроса нет плана объяснения) с 120 параметрами), но это занимает меньше времени по сравнению с (a), почти так же, как (b), поэтому, возможно, Oracle сможет создать этот план быстрее, если аналогичный запрос был выполнен до
В чем причина?