У меня есть SQL-запрос, который при запуске с jOOQ занимает 1 минуту 10 секунд, но при выполнении непосредственно в БД это занимает всего 4 секунды.
Я гарантировал, что в обоих случаях это тот же SQL, что и оператор, который я выполняю с помощью psql
, перед тем, как выполнить его, скопированный из записанного в jOOQ.
Соответствующая часть кода jOOQ:
...
and(arrayOverlap(MY_TABLE.MY_FIELD, val(uuid_array)))
...
, которая генерирует оператор PostgreSQL, содержащий:
...
("schema"."my_table"."my_field" && cast('{...}' as uuid[])
...
Нам удалось заставить jOOQ быстро выполнить этот код, изменив предыдущий код на:
final String myItems = myField.stream()
.map(UUID::toString)
.collect(joining("\",\""));
и затем:
and(condition("{0} && '{\"" + myItems + "\"}'::uuid[]", MY_TABLE.MY_FIELD));
Итак, я передаю точно такое же значение, которое jOOQ создавал сам, но для jOOQ теперь это просто строка.
Почему jOOQ медленно выполняет этот запрос? Есть ли альтернатива тому, что я сделал? (Я предпочитаю не создавать SQL сам, как это.)
Кстати: Я посмотрел на эту другую проблему , но в моем сгенерированном SQL я думаю Я использовал одну переменную привязки, так как я уже используя val
, чтобы обернуть массив.