在性别字段的 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 中过滤花费大量时间的主要内容,如果未能解决你的问题,请参考以下文章