gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:42:28 26 4
gpt4 key购买 nike

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

.where(
Tables.TABLE.FIELD.in(idsList)
)
  1. 我该怎么做?
  2. 为什么默认情况下不这样做,因为生成(并由 PG 解析)字符串 in (?, ?, ?, ?, ...)
  3. 的效率更高

最佳答案

How can I do this?

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

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

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

Why it's not done by default since it's more efficient that generation (and parsing by PG) of the string

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

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

注意过早优化!

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

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

IN 列表似乎始终优于数组版本(在我的特定基准案例中)直到长度约为 50

关于java - 如何让 JOOQ 在 IN 子句中使用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43099226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com