我有一个非常简单的JOOG查询:
jooq.select(TABLE_NAME.fields())
.from(TABLE_NAME)
.where(TABLE_NAME.ID.in(ids))
.fetchInto(tableDTO.class);
其中id为List<BigInteger>
JOOG生成的查询:
select
"schema"."table_name"."id",
"schema"."table_name"."entity_id",
"schema"."table_name"."code",
"schema"."table_name"."created_date",
...
from "schema"."table_name" where "schema"."table_name"."id" in (3623)
表格DTO:
@Data
public class tableDTO{
private BigInteger id;
...
表DDL:
create table table_name
(
id bigint default nextval('schema.table_name_id_seq'::regclass) not null primary key,
...
此外,该表还有一个forcedType,用于将字段ID转换为BigHandler:
<forcedType>
<name>DECIMAL_INTEGER</name>
<includeExpression>.*\.(TABLE_NAME)\.(ID|PARENT_ID|ENTITY_ID)</includeExpression>
</forcedType>
Issue
当我通过JOOQ运行这个查询时,它会以某种方式将bigint
的列表转换为numeric
,并且postquist使用并行seq扫描而不是索引扫描.
通过打印jooq查询计划我可以看到:
Fetched result: +----------------------------------------------------------------------------------+
|QUERY PLAN |
+----------------------------------------------------------------------------------+
|Gather (cost=1000.00..1561941.21 rows=65315 width=1896) |
| Workers Planned: 2 |
| -> Parallel Seq Scan on table_name (cost=0.00..1554409.71 rows=27215 width=1896)|
| Filter: ((id)::numeric = '3623'::numeric) |
+----------------------------------------------------------------------------------+
但当我通过DataGrip运行完全相同的查询时,Postgs正在使用索引扫描:
Index Scan using table_name_pkey on table_name (cost=0.43..2.65 rows=1 width=1896)
Index Cond: (id = 3623)
我已经try 过吸尘、分析这张桌子了.看起来我的桌子非常好,而且不知何故jooq产生了这些错误的演员
问题
为什么会发生这种隐性演员阵容?这是JOOG的错还是DB的错?