GBase 8a
性能调优
文章

GBase 8a 里 count(distinct) 为什么容易慢?可以先从这几个点下手

发表于2026-03-23 08:14:0729次浏览5个评论

count(distinct) 在分析场景里很常见,但数据量一大,很多人都会感觉它比普通聚合更容易变慢。原因不复杂:去重本身就更重,再叠加分布式节点间的数据交换,压力会更明显。

一个典型场景

 

select stat_date,
       count(distinct user_id) as uv
from dws_user_visit
where stat_date between '2026-03-01' and '2026-03-18'
group by stat_date;

 

这类 SQL 慢,通常先看三个方向:
一是 user_id 分布是否均匀;
二是过滤条件有没有尽量前推;
三是是否同时带了很多没必要的列和表达式。

常见优化方向对比

优化点作用适用情况
先过滤再聚合减少参与计算数据量时间范围、状态过滤明确
避免无关字段参与降低中间结果大小宽表场景
检查分布键减少节点倾斜节点耗时差异大
调整聚合相关参数缓解重分布压力特定大聚合场景

相关参数可以关注

参数说明
gcluster_hash_redistribute_groupby_optimize优化 group by / distinct 重分布
gbase_parallel_degree控制并行执行程度
gcluster_dql_statistic_threshold记录执行超时 SQL,方便排查

比如可以先把慢 SQL 统计打开:

 

set global gcluster_dql_statistic_threshold = 3000;

 

然后再去看最近慢下来的语句。

一个常见误区

很多人碰到 count(distinct) 慢,就直接上参数。其实更常见的问题是:
表设计本身已经倾斜,或者 SQL 先把大量无效数据卷进来了。
参数能帮一部分,但前提还是 数据分布和 SQL 路径别太离谱

评论

登录后才可以发表评论
用户头像
柒柒天晴发表于 4个月前
学习 下
GBase用户47954发表于 3个月前
感谢作者的精彩分享!
曾浩轩发表于 2个月前
学会了
白芷发表于 2个月前
三人行必有我师
weifeng发表于 2个月前
向大佬学习