在性别字段的 posgresdb 中过滤花费大量时间

Posted

技术标签:

【中文标题】在性别字段的 posgresdb 中过滤花费大量时间【英文标题】:filter taking to much time in posgresdb on gender field 【发布时间】:2021-05-07 05:45:28 【问题描述】:

我有一张 1 亿多行的表,看起来像这样

Create table member (
  id bigint,
  gender text,
  //..other fields
  primary key (id)
);

现在 gender 字段有两个可能的值 'M''F'

每当我使用性别字段时,我都需要很长时间才能在其他字段(例如 id、会员详细信息、手机号码)上建立索引

select 
count(1) filter (where mod.is_active and m.gender = 'M') as male,
count(1) filter (where mod.is_active and m.gender = 'F') as female
from member_other_details mod
inner join member m on m.id = mod.member_id

这个查询需要几个小时才能完成

如何优化?

【问题讨论】:

edit您的问题并添加使用explain (analyze, buffers, format text)生成的execution plan(不是只是一个“简单”解释)为formatted text,并确保保留计划的缩进。粘贴文本,然后将``` 放在计划前一行和计划后一行。还请包括所有索引的完整 create index 语句。 请注意,count(*) 实际上会比count(1) 稍快 索引不会真正帮助该查询,因为您正在读取两个表中的所有行。有点不清楚您要达到的目标。目前您正在计算男性和女性成员的详细信息数量。如果您只想获取男性或女性 成员 的数量,那么您应该删除加入,这肯定会加快速度。 @a_horse_with_no_name 请检查我是否已修改 【参考方案1】:

我个人会执行这个查询

select m.gender,count(*)
from member_other_details mod inner join member m on m.id = mod.member_id
where mod.is_active
group by m.gender

【讨论】:

以上是关于在性别字段的 posgresdb 中过滤花费大量时间的主要内容,如果未能解决你的问题,请参考以下文章

针对特定数据字段的高效搜索算法

mysql查询优化

加密的核心数据在删除 40 万多条记录时需要花费大量时间

在条件动态过滤的选择位置中嵌套“ifs”

如何在 android 中注销后清除 Facebook 字段(图像、姓名、性别)

在大量查询结果的循环中,更新操作花费了奇怪的时间