Amazon Redshift 性能调优 - 分布键、排序键与 WLM 优化
解析 Redshift 分布样式与排序键的选择、工作负载管理 (WLM) 设计以及 AQUA 查询加速。
分布样式的选择
Redshift 将数据分布存储在计算节点的切片中。分布样式的选择是直接影响查询性能的最重要的设计决策。KEY 分布根据指定列的值分布数据,具有相同键值的行放置在同一切片中。将 JOIN 中频繁使用的列指定为 KEY,JOIN 时就不再需要数据重分布(网络传输),可获得大幅的性能改善。EVEN 分布以轮询方式均匀分布数据,适合没有特定 JOIN 模式的表。ALL 分布将整个表复制到所有节点,对小型维度表的 JOIN 有效。AUTO 分布由 Redshift 根据表的大小自动选择,小表为 ALL,大表为 EVEN。
排序键与 Zone Map
设置排序键后,数据会按该列的值的顺序存储在磁盘上。Redshift 为每个块记录最小值和最大值作为 Zone Map,并跳过 WHERE 子句的过滤条件超出 Zone Map 范围的块。将日期列设为排序键并应用 WHERE created_at > '2026-01-01' 之类的过滤时,仅扫描相应时间段的块,I/O 大幅减少。复合排序键是多个列的组合,排在最前的列的过滤效果最好。交错排序键为各列赋予同等的权重,无论按哪个列过滤都会起作用,但 VACUUM 的负载会变高。
工作负载管理与 AQUA
自动 WLM 根据查询的复杂度和资源需求,自动优化队列的分配和内存的分配。解决短时间的仪表板查询被长时间的 ETL 查询阻塞的问题,为高优先级的查询分配适当的资源。手动 WLM 可以定义最多 8 个队列,并根据用户组或查询组路由查询。AQUA 是 RA3 实例上可用的功能,在存储层的定制硬件上执行过滤和聚合处理。AQUA 减少传输到计算节点的数据量,并将扫描密集型查询的速度最高提升 10 倍。
性能调优的成本影响
适当的性能调优有助于直接降低成本。通过优化分布键减少节点间的数据重分布(Redistribution),查询的执行时间会缩短,Serverless 的 RPU 消耗量也会减少。通过设置排序键提高 Zone Map 的跳过率,扫描的数据量会减少,I/O 成本也会降低。AQUA(Advanced Query Accelerator)可在 RA3 节点上免费使用,将 LIKE 子句和过滤的处理卸载到存储层,提高查询性能。
查询分析与执行计划
性能调优的第一步是找出哪些查询很慢。Redshift 具备记录已执行查询的历史和耗时的系统视图,可以从中找到有问题的查询。查看查询的执行计划,就能知道哪里耗时,以及节点之间是否发生了大量的数据移动。如果出现了意料之外的全表扫描或低效的连接,那就是改进的对象。不是凭推测进行调优,而是根据实测数据和执行计划找出瓶颈,这是有效改进的出发点。
表的维护
在 Redshift 中,反复更新或删除数据,内部的数据排列会变得混乱,查询性能有时会逐渐下降。整理这些的维护工作很重要。适当地执行整理数据排列并回收已删除空间的处理,以及更新统计信息的处理,就能保持性能。这些处理也有自动执行的机制,但在进行大量数据变更后,确认表的状态。利用自动调整表优化的功能,可以在减少运维工作量的同时保持良好的性能。定期的维护有助于长期稳定的性能。
结果缓存与物化视图
同一个查询反复执行时,每次都从零开始计算是一种浪费。Redshift 具备对相同查询重用以前结果的机制,可以快速返回重复的查询。将频繁执行的汇总处理做成预先计算并保存结果的物化视图,就能避免每次的繁重计算。源数据更新后,刷新视图以保持最新的结果。善用重用计算结果的机制,可以减少反复产生的负载,大幅改善仪表板和定期报表的响应。
持续监控与调优循环
性能调优不是一次性的事情,而是持续的工作。随着数据量的增加和使用模式的变化,最佳的设置也会改变。设置查询监控规则,以便能够检测极其繁重的查询和异常的执行。运行定期找出慢查询、查看执行计划并加以改进的循环。衡量改进的效果,确认是否真的变快了。持续进行监控、分析、改进、验证的循环,即使数据规模增长,也能一直保持稳定的响应性能。
总结
Redshift 性能调优的基础是适当设置分布样式和排序键。通过 SVL_QUERY_SUMMARY 识别慢查询,通过调整分布键或添加排序键进行改善。利用自动 WLM 管理工作负载优先级,通过 AQUA 提升扫描性能,优化大规模数据分析的响应时间。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。