【问题标题】:Using Postgres VALUES function in an IN clause in JOOQ在 JOOQ 的 IN 子句中使用 Postgres VALUES 函数
【发布时间】:2021-08-28 11:38:22
【问题描述】:

我必须使用巨大的 IN 子句(大约 1000 个值)执行查询。例如,在 SQL 中它看起来像

WHERE "entity"."page" IN (1, 2, 3, 4, 5,...)

在 Postgres 中,当您像这样在 IN 子句中使用 VALUES 函数时,它似乎要快得多:

WHERE "entity"."page" IN (VALUES (1), (2), (3), (4), (5),...)

但我不知道如何在 JOOQ 中创建这样的查询。这可能吗?

很遗憾,我对数据模型无能为力 - 它是一个遗留应用程序。

【问题讨论】:

    标签: postgresql jooq


    【解决方案1】:

    VALUES() 构造函数还不能用作顶级查询类型,在 jOOQ 中,请参阅问题 #5871。您只能在FROM 子句中使用它,通过:

    .where(ENTITY.PAGE.in(selectFrom(values(row(1), row(2), ...))))
    

    也许这也会为您带来所需的加速? Alternatively, use arrays as shown in this article here。它表明,对于较旧的 PG 版本(9.5),在一个简单的基准测试中,数组在大小为 64 左右时开始优于 IN 列表。您可能会在您的环境中找到不同的数字,但对于 1000 个值,确实应该更好。

    This question shows how to use an array in jOOQ:

    .where(ENTITY.PAGE.eq(any(1, 2, 3)))
    

    我通常更喜欢单个数组绑定变量而不是可变长度动态 SQL 字符串,特别是如果 PostgreSQL 决定实现更复杂的执行计划缓存 in case of which it will be imperative to prefer less dynamic SQL strings

    【讨论】:

    • 谢谢!使用 selectFrom(values... 在 ((select "v"."c1" from (values (1), (2), (3),...) as " v"("c1"))).
    • @jch-me:是的,这不是一回事。
    猜你喜欢
    • 2017-08-23
    • 2018-03-23
    • 2021-03-12
    • 2016-05-07
    • 1970-01-01
    • 2016-10-28
    • 2018-05-22
    • 2017-01-24
    • 2015-06-29
    相关资源
    最近更新 更多