JOOQ медленно обрабатывает массивы? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть 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, чтобы обернуть массив.

...