如何为含WHERE与GROUP BY的AWS Redshift表选择sortkey与distkey
Sort Key & Dist Key 选择方案(针对你的查询)
先贴出修正后的查询语句(原语句WITH语法有误,调整为标准SELECT格式):
SELECT user_id, aggregate metrics FROM table WHERE date < end_time AND date >= start_time GROUP BY user_id
关于Sort Key(排序键)
- 把
date设为主Sort Key是完全正确的选择:你的查询第一步就通过日期范围过滤数据,Redshift的排序键能让查询直接跳过不符合条件的数据块,大幅减少扫描的数据量,这是最立竿见影的优化。 - 如果想进一步优化GROUP BY的性能,可以把
user_id作为复合排序键的第二列(即(date, user_id))。这样在完成日期过滤后,相同user_id的数据会物理上聚集在一起,GROUP BY时不需要跨数据块匹配聚合,能降低节点内的计算开销。
关于Dist Key(分布键)
- 绝对不推荐把
user_id设为Dist Key:正如你担心的,用户数据几乎必然存在严重倾斜(比如头部大用户贡献了大量数据),会导致单个节点负载暴增,拖慢整个查询的完成时间。 - 最优选择是用自动分布(AUTO):Redshift的自动分布策略会根据表数据量、查询模式动态调整数据分布,能很好平衡各节点的负载,适合这种有分组操作但又怕数据倾斜的场景。
- 如果必须手动指定,**偶数分布(EVEN)**是次优解:它会把数据均匀打散到所有节点,虽然GROUP BY时需要跨节点传输部分数据,但彻底避免了单节点过载的问题,在数据倾斜严重时反而比按user_id分布更高效。
额外优化建议(针对数据倾斜)
如果后续查询还是遇到性能瓶颈,可以试试:
- 对头部高频大用户单独拆分数据:比如把Top 100个数据量最大的用户单独存到一个小表,查询时分别聚合主表和小表的数据再合并,避免大用户占用单个节点的全部资源。
- 用Redshift的系统视图(比如
stl_scan、svv_table_info)检测数据倾斜情况,针对性调整分布策略。
内容的提问来源于stack exchange,提问作者Kartikay Bagla
相关产品推荐
相关产品推荐

