在 JOOQ 的 IN 子句中使用 Postgres VALUES 函数

Using Postgres VALUES function in an IN clause in JOOQ

我必须使用巨大的 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 中创建这样的查询。这可能吗?

很遗憾,我无法对数据模型做任何事情 - 它是一个遗留应用程序。

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 个值,它确实应该更好。

:

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

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