在 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.
我必须使用巨大的 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.