我有一个SQL查询,当与jOOQ一起运行时,需要1分钟10秒才能完成,但是直接在数据库中执行时只需要4秒。
在两种情况下,我都确保它与我用psql
执行的语句是相同的SQL,是从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。)
BTW:我看了一下这个other issue,但是在我生成的SQL中,我认为我正在使用单个绑定变量,因为我已经在使用val
包装数组。