【问题标题】:Are arrays optimized in jOOQ & PostgreSQL?数组在 jOOQ 和 PostgreSQL 中优化了吗?
【发布时间】:2018-02-02 00:19:48
【问题描述】:

我有很多标识符,我想像这样添加到WHERE 子句中:

identifier IN (..., ..., ..., ...)

但是,这很慢,因为它必须单独绑定每个值。请记住,列表很长(几乎 1000 个值)。在这种情况下,最好使用:

identifier = ANY({..., ..., ..., ...})

现在,我们只绑定数组一次。

我尝试在 jOOQ 中这样做:

Integer[] values = {..., ..., ..., ...}
DSL.any(DSL.array(values))

生成如下SQL:

"identifier" = any (array[?, ?, ?, ...])
TRACE | 2017-08-24 10:02:08,914 | JooqLogger.java | 187 | Binding variable 1       : ...
TRACE | 2017-08-24 10:02:08,947 | JooqLogger.java | 187 | Binding variable 2       : ...
TRACE | 2017-08-24 10:02:08,958 | JooqLogger.java | 187 | Binding variable 3       : ...
...

所以,这让我得出结论,我们仍在单独绑定每个值?有没有办法优化这个?

【问题讨论】:

    标签: java postgresql jooq


    【解决方案1】:

    替换:

    DSL.any(DSL.array(values));
    

    与:

    DSL.any(values);
    

    创建单个绑定变量。

    或者,您可以显式创建该绑定变量:

    Field<Integer[]> array = DSL.val(values);
    DSL.any(array);
    

    【讨论】:

    • 使用DSL(values)时会生成以下SQL:identifier = any (?::any[]))。此参数永远不会绑定,我们最终会遇到 SQL 语法异常:Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "any"
    • DSL.any(DSL.val(values)) 给出了完全相同的问题。
    • 我使用的是 3.9.5 版本。我只是像任何常规选择查询一样运行查询:context.select(...)...fetch()。在DefaultConfiguration 上,设置了 Postgres 方言。我可以写一篇 GIST,但要等到下周初。
    • 我无法使用Integer[] 重现此问题。您是否正在使用Object[]?或者你有不一致的可变参数类型?确实,需要一个完整的代码 sn -p 然后,看看你是如何运行查询的。
    • 哦,我明白了。这个问题在你的另一个问题中得到了解释:stackoverflow.com/q/45858042/521799。事实上,您使用的是Object[]。会在那里回答。
    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 2012-03-01
    • 2016-11-04
    • 2015-05-09
    • 2019-08-06
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多