【已解决】count distinct如何优化?

Viewed 87

版本:1.2.7

表模型duplicate,里面有个distinct_id字段,字段类型为varchar。这个表按天分区,每天数据量1.5亿左右。执行如下SQL耗时3秒(where条件过滤后的数据是1亿条),业务要求1秒之内返回结果,请问有什么优化的方法吗?

select
pt,
COUNT(case when event = 'page_load' then 1 else null end),
COUNT(distinct case when event = 'page_load' then distinct_id else null end)
from
xxx
where
pt between '2024-04-21' and '2024-05-20'
and event = 'page_load'
group by
pt

1 Answers

可以考虑以下几种优化方式:

  1. 索引优化:确保pt字段以及event字段上有索引,对于分区表来说,通常建议对分区键建立索引以加快查询速度;可以考虑升2.0用倒排索引加速:倒排索引
  2. 查询改写:由于COUNT(DISTINCT case when ... then distinct_id else null end)需要对大量数据进行去重操作,这通常是一个性能瓶颈。如果业务场景允许,可以尝试将条件计数和去重计数分开查询,然后通过程序进行合并。
  3. 数据预处理:对于每天1.5亿的数据量,可以考虑在数据加载时进行预处理,比如预先计算每天的event = 'page_load'的计数和去重计数,然后存储在一个汇总表中。
  4. 可以考虑升级至大于等于2.0 的版本,对于这类聚合运算有较大的提升。