postgres:通过 varchar 搜索,这是 java 中的枚举

Posted

技术标签:

【中文标题】postgres:通过 varchar 搜索,这是 java 中的枚举【英文标题】:postgres: search by varchar which is enum in java 【发布时间】:2020-06-30 20:22:21 【问题描述】:

我有一个表,我在 varchar 列上查询。它可以是极少数可能的值之一(它是一个简单的 java 枚举)。

SQL:

SELECT *
FROM   activation 
WHERE  registration = '1312313'
       AND status = 'WORKING';

在这里我运行EXPLAIN ANALYZE EXECUTEhttps://explain.depesz.com/s/Whuq,因为似乎问题在于按状态过滤。 registration 列上有一个索引。

status 列上添加索引是否合理,或者在这里有点矫枉过正?如果是,我该如何优化给定的查询?

【问题讨论】:

【参考方案1】:

对于此查询,您需要对出现在where 子句中的列进行复合 索引。将最严格的标准放在首位通常是个好主意(这里,我知道这是registration):

create index activation_idx on activation(registration, status);

如果您总是过滤相同的 status 值,那么 a partial index 可能至少同样有效,而且成本更低:

create index activation_idx_partial 
    on activation(registration) 
    where status = 'WORKING';

【讨论】:

首先,从不知道部分索引,但我过滤了少数status 值。其次,它实际上取决于哪些标准更具限制性的数据。当registration 的初始过滤只返回几条记录时,它运行良好,但结果并非总是如此,这就是为什么我首先对它感到困惑。所以,我需要一个不依赖于谓词顺序的查询。可能复合索引将是一个解决方案。我是否需要删除旧的 registration 唯一索引?还是两个都可以? @fasth:从技术角度来看,同时拥有两个索引是可以的(Postgres 会选择它喜欢的那个)。但归根结底,保留未使用的索引是没有意义的(它会消耗存储空间并且会在 DML 语句上为数据库带来更多工作) - 因此,除非您有另一个使用该索引的查询,否则只需删除它。 @GBM:根据***.com/questions/29217030/…这里的答案,如果registration过滤非常有选择性,效率不会受到严重影响,我将在其他地方使用这个复合索引而不是普通的(create index activation_reg on activation(registration))?

以上是关于postgres:通过 varchar 搜索,这是 java 中的枚举的主要内容,如果未能解决你的问题,请参考以下文章

使用 typeorm 在 postgres 中搜索数组中的项目

Postgres声称驱动器空间不足,可用空间充足

postgres数据库varchar类型的最大长度

NHibernate 拒绝验证 postgres12 中 varchar(255) 的字符变化

云服务器上Postgres全文搜索的进一步优化

Django Admin 搜索查询未命中 Postgres 索引