繁体   English   中英

如何使JOOQ在IN子句中使用数组

[英]How to make JOOQ to use arrays in the IN clause

我希望JOOQ生成... in (?)并将list绑定为数组参数(Postgres)。 我的代码看起来像

.where(
   Tables.TABLE.FIELD.in(idsList)
)
  1. 我怎样才能做到这一点?
  2. 为什么默认情况下没有这样做,因为in (?, ?, ?, ?, ...)字符串的生成(以及PG解析)效率更高

我怎样才能做到这一点?

您可以使用DSL.any(T[])运算符,例如

TABLE.FIELD.eq(any(1, 2, 3))

这只会将一个数组变量绑定到JDBC语句

为什么默认情况下不会这样做,因为它对字符串的生成(以及PG的解析)更有效

可能值得考虑Settings的标志。 我已经为此注册了一个功能请求: https//github.com/jOOQ/jOOQ/issues/6029

通常,jOOQ允许用户准确地编写他们想要发送到数据库服务器的SQL,因此SQL的自动“优化”和重写可能对某些用户来说非常出乎意料。 这只是jOOQ中的一般经验法则。 总是值得考虑优化并让他们通过Settings选择加入。

关于过早优化的警告!

但是,实际测量这些东西总是很重要的。 虽然使用您建议的方法肯定会减少解析和SQL生成开销,但要注意,与硬连接的IN列表相比,数组的基数可能更难以正确估计。 对小列表使用数组可能会对执行计划产生负面影响。 因此,您在解析器端保存的几微秒将在执行端计算几毫秒(?)!

我在以下博客文章中对此进行了基准测试: https//blog.jooq.org/2017/03/30/sql-in-predicate-with-in-list-or-with-array-which-is-faster

IN列表似乎始终优于阵列版本( 在我的特定基准情况下 ),直到大约50的长度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM