CREATE TABLE IF NOT EXISTS events
(
      id                    UUID NOT NULL,
      type_id       UUID,
      occurred_at TIMESTAMP WITH TIME ZONE NOT NULL,
      PRIMARY KEY (id)
);

jood代码:

val queryDsl = dslContext.select(EventFields).from(EVENTS)
                .where(
                    (EVENTS.TYPE_ID.isNull)
                        .or(EVENTS.TYPE_ID.eq(query.typeId.id))
                )

型号ID代码:

import java.util.UUID

data class TypeId(val id: UUID) {
    constructor (id: String) : this(UUID.fromString(id))

    override fun toString(): String = id.toString()
}

-你在说什么?

where ("public"."events"."type_id" = cast('d0c6a2a7-2032-4dd7-b2b1-77a554262af7' as uuid))

为什么选角?

我试图摆脱这个选角,因为它会影响我的指数表现

我的索引:CREALEDEX company_emergency_cappened_at_idx ON balance_State_Events(id,Type_id,cappened_at DESC);

在我的解释查询中,其中一行是:过滤器:((类型_id IS空)OR(类型_id =Ɔcaffd-9 c3 b-4 ea 4-b5 e2 - 6ae 342268141 ':uuid)),如果有索引,为什么还有显式过滤器

推荐答案

为什么选角?

jOOQ中有一个相对较新的修复,其中all UUID绑定值现在被显式地转换为SQLDialect.POSTGRES的类型:

该修复已应用于版本:

  • 3.20.0
  • 3.19.6
  • 3.18.13
  • 3.17.22

在很多边缘情况和不那么边缘的情况下,这是必要的.jOOQ不会对所有这些情况进行硬编码以根据上下文做出更具体的决定,它只是强制转换all UUID个类型化的绑定值,就像它自动强制转换所有这些类型化的绑定值一样:

  • Enum类型
  • 间隔类型
  • 杨森输入
  • 类型化的文档
  • 空间类型

future 可能还会更多.

这回答了您提出的问题(标题中的问题).

我试图摆脱这个选角,因为它会影响我的指数表现

我认为这个演员阵容不会影响你的表现.绑定值是一个常数,转换它不会改变任何事情.如果没有演员阵容,随着类型的晋升,仍然会有隐性演员阵容.

然而,您的OR断言更有可能出现问题:

((type_id IS NULL) OR (type_id = '390caffd-9c3b-4ea4-b5e2-6ae342268141'::uuid))

请判断为什么在您的情况下,您的执行计划中没有出现BitmapOr操作.从您提供的少量信息很难说.在一个更简单的例子中,这可以很好地工作:

create table t (i uuid);
create index i on t (i);
insert into t select uuid_generate_v4() from generate_series(1, 1000000) as t (i);

explain
select *
from t
where i is null or i = cast('390caffd-9c3b-4ea4-b5e2-6ae342268141' as uuid)

制作:

|QUERY PLAN                                                                         |
|-----------------------------------------------------------------------------------|
|Bitmap Heap Scan on t  (cost=8.87..12.88 rows=1 width=16)                          |
|  Recheck Cond: ((i IS NULL) OR (i = '390caffd-9c3b-4ea4-b5e2-6ae342268141'::uuid))|
|  ->  BitmapOr  (cost=8.87..8.87 rows=1 width=0)                                   |
|        ->  Bitmap Index Scan on i  (cost=0.00..4.43 rows=1 width=0)               |
|              Index Cond: (i IS NULL)                                              |
|        ->  Bitmap Index Scan on i  (cost=0.00..4.43 rows=1 width=0)               |
|              Index Cond: (i = '390caffd-9c3b-4ea4-b5e2-6ae342268141'::uuid)       |

这表明您可能还有另一个问题要问,最好是在一个新问题中,因为这个问题是关于jOOQ和选角的,而不是关于您的实际表现问题.

Postgresql相关问答推荐

如何在PostgreSQL中对深度嵌套的jsonb属性创建索引

Postgres从spark触发post-write

PostgreSQL 连接字符串的正则表达式

gorm 不生成字符串列

为什么在 PostgreSQL 中忽略查询超时?

Supabase 数据库大小问题

在 PostgreSQL 中 Select 数字命名列会返回 ?column?

查找最小值和最大值

PostgreSQL:是否可以将枚举转换为整数?

Rails:安装 pg gem 时出错

!= 和 <> 运算符有什么区别?

从 PostgreSQL 中的字段中提取数字

Postgres 外键on update和on delete选项如何工作?

获取全文搜索配置语言的完整列表

在 MAC OS X 10.6 for PostgreSQL 上设置 SHMMAX 等值

可以为空的列在 PostgreSQL 中是否会占用额外的空间?

全文的 Postgresql 前缀通配符

Postgres:为 CAST 失败定义一个默认值?

使用 Postgres 在 Rust 的 Diesel 库中添加时间戳

使用 PostgreSQL 的 Linq To Sql