针对 Presto 引擎,有哪些常用的 SQL 查询性能优化手段?
考察说明
考查对 Presto 查询优化机制的理解及实际调优经验。
回答思路
- 【回答框架 1】Presto 是分布式 SQL 查询引擎,优化核心在于减少数据扫描量、降低网络传输和提升并行度。首要原则是下推过滤和投影,利用分区裁剪和列式存储(如 ORC/Parquet)只读取必要列,避免 SELECT *。
- 【回答框架 2】合理设计 Join 策略:优先使用 Hash Join,确保小表作为构建侧,必要时通过 join_reordering 或手动调整 SQL 顺序;对于大表 Join,可考虑分桶或使用 Bucketed Table 减少 Shuffle。
- 【回答框架 3】优化聚合和窗口函数:使用近似聚合(approx_distinct)处理超大基数,避免全局排序,利用本地聚合减少数据倾斜;窗口函数尽量在分区内计算,避免全量排序。
- 【回答框架 4】关注资源与并发配置:调整 task 并发度、内存参数(如 query.max-memory)和节点数,避免数据倾斜,可通过 skew join 优化或重分区键。
- 【回答框架 5】利用执行计划分析:通过 EXPLAIN 查看计划,识别高成本节点,如 Exchange 和 Cross Join,针对性改写 SQL,例如将子查询改为 JOIN 或使用 WITH 语句。
- 【关键点 1】列裁剪和分区裁剪是首要优化手段。
- 【关键点 2】Hash Join 优于 Nested Loop,小表作为构建侧。
- 【关键点 3】近似聚合可显著降低大数据量下的计算开销。
- 【关键点 4】数据倾斜需通过重分区或 skew join 缓解。
- 【关键点 5】EXPLAIN 是定位性能瓶颈的关键工具。
- 【易错点 1】不要盲目增加并发度,可能加剧资源竞争。
- 【易错点 2】避免过度使用近似聚合,影响精度。
- 【易错点 3】忽略数据分布直接优化 SQL 可能无效。