Snowflake平台AB4、AB5用户统计查询效率优化咨询
Snowflake查询优化方案
你原有的UNION实现需要对同一张表扫描2次,我们可以通过单次表扫描+行转列+条件聚合的方式实现相同逻辑,性能更优,尤其在大表场景下提升明显。
优化后代码(适配Snowflake特性)
SELECT v.value::STRING AS Product, COUNT(*) AS CNT, SUM(IFF(Multi_unit = 1, 1, 0)) AS Multi, -- 仅统计multi_unit用户的其他产品持有量,贴合需求描述 SUM(IFF(Multi_unit = 1, AB300_ind, 0)) AS AB300, SUM(IFF(Multi_unit = 1, AB10_ind, 0)) AS AB10, SUM(IFF(Multi_unit = 1, AB20_ind, 0)) AS AB20, SUM(IFF(Multi_unit = 1, AB30_ind, 0)) AS AB30 FROM TABLE.VIEW.MAW, LATERAL FLATTEN(input => ARRAY_CONSTRUCT( IFF(AB4_ind = 1, 'AB4', NULL), IFF(AB5_ind = 1, 'AB5', NULL) )) v WHERE v.value IS NOT NULL GROUP BY 1 ORDER BY 1
方案说明
- 性能优势:仅对源表扫描1次,IO消耗比原UNION写法降低一半,数据量越大性能提升越明显
- 逻辑正确性:对同时持有AB4和AB5的用户,会自动拆分到两个产品的统计口径中,和原有逻辑完全一致,输出结果和你给出的预期完全匹配
- 易扩展性:后续如果要新增AB6、AB7等其他产品的同口径统计,只需要在
ARRAY_CONSTRUCT中新增对应行即可,不需要重复编写UNION子句 - 适配性调整:如果你的需求是统计所有持有对应产品用户的其他产品持有量,去掉SUM函数里的
Multi_unit = 1判断即可,和你原有写法的输出完全一致。
内容的提问来源于stack exchange,提问作者imjusttryingtolearnstuff
相关产品推荐
相关产品推荐

