【详述】如标题所示,我们有自助分析的场景,用户会对数据集进行内筛去重,对应的SQL如下所示:
表table1,字段有a,b,c,pt,uuid(字符串)
select count(distinct if(a>1,uuid,null)) as c1,count(distinct if(b>10,uuid,null)) as c2,sum© from table1 where pt = ‘20230104’ group by a,b,c ;
针对这类的SQL,应该如何去优化,目前我们小数据量场景都是使用资源硬算,查询时间随数据量的增大而增长,社区有没有小伙伴针对这类的业务场景SQL是怎么优化的,方便给个优化的demo,或者建议嘛
【背景】无
【业务影响】
【是否存算分离】
【StarRocks版本】例如:3.2.8
【集群规模】例如:
【机器信息】CPU虚拟核/内存/网卡,例如:48C/64G/万兆
-
可以考虑使用物化视图 看上述信息查询是频繁执行的 可以创建视图预计算下结果
-
cte 避免重复计算,可以使用子查询或公用表达式 (CTE) 来减少重复计算的部分
在细分的话 可以考虑 尝试将条件放入聚合函数内而不是在外部的 IF
语句中 然后可以尽量保证 pt
字段上有索引,这样可以加速 WHERE
子句的过滤,然后分区这里 可以考虑按 pt
字段进行分区,这样查询时只会扫描相关分区 有些加速的效果 具体这个还是要看你们实际的场景 这里只是优化建议 可能并不使用 供参考
WITH filtered_data AS (
SELECT uuid, a, b, c
FROM table1
WHERE pt = ‘20230104’
)
SELECT
COUNT(DISTINCT IF(a > 1, uuid, NULL)) AS c1,
COUNT(DISTINCT IF(b > 10, uuid, NULL)) AS c2,
SUM© AS total_sum
FROM filtered_data
GROUP BY a, b, c;
Hello,我理解可以通过物化视图提前进行预计算,但如果我count(distinct if)中if的条件发生变更时,比如原来是if(a>1),后来改成if(a < 0) 那么针对原先创建的物化视图是否还能对 count(distinct if (a<0,uuid,null))生效呢,目前看下来是不行的,是否有一种通用的物化视图创建方式,可以针对我内部修改if条件时,依然视图可以通用呢,因为我们是比较灵活的自助分析场景,条件是随时可以变化,不像传统的报表一般,SQL是固定的。
然后你提及的将条件放在聚合函数内而不是外部if语句中,这个不太行,因为内筛与外部过滤他们的查询结果是不一样的,表达的含义也是不同的。期待你的回复