SQL面试题更新 2026-08-03

在 Spark SQL 中,一条查询语句从提交到执行会经历哪些阶段,执行计划是如何逐步生成和优化的?当使用 Explain 命令查看查询计划时,返回结果中的各个部分分别代表什么含义,如何通过解读这些信息来定位查询性能问题?

考察说明

考查对 Spark SQL 查询编译与优化全流程的掌握,以及对执行计划各阶段的理解与排查能力。

回答思路

  1. 【回答框架 1】Spark SQL 查询从 SQL 文本经过解析生成未解析的逻辑计划,其中只是语法树的表示,表名和列名尚未绑定;之后通过分析器结合 Catalog 解析表列信息,生成解析后的逻辑计划,并完成属性绑定和类型检查。
  2. 【回答框架 2】随后进入逻辑优化阶段,即优化器对逻辑计划应用一系列规则,如谓词下推、列剪枝、常量折叠、合并相邻操作、算子下推等,生成优化后的逻辑计划。这些规则基于关系代数等价变换,不改变查询结果但显著减少扫描和计算量。
  3. 【回答框架 3】优化后的逻辑计划经过规划器转换成物理计划,物理计划会选择合适的执行策略,如选择 join 算法(BroadcastHashJoin、SortMergeJoin、ShuffledHashJoin)、确定 shuffle 分区数、决定是否使用动态分区裁剪或自适应执行。物理计划还可以生成多个候选并基于代价模型估算最优执行粒度。
  4. 【回答框架 4】Explain 结果的解读:在 Spark SQL 中执行 explain 会输出物理计划,通常包含两个主要部分:Parsed Logical Plan(解析后的逻辑计划)、Analyzed Logical Plan(分析后的逻辑计划)、Optimized Logical Plan(优化后的逻辑计划)和 Physical Plan(物理计划)。每部分对应不同的处理阶段,物理计划是最终执行依据,其中的算子顺序、扫描方式、shuffle 配置和过滤器位置决定了执行过程中的数据流动和开销。
  5. 【回答框架 5】解读时重点关注几点:过滤条件下推的位置是否足够靠前,以尽早减少数据量;project 是否裁剪了非必要列;join 类型是 broadcast 还是 sort-merge,以及是否触发了广播阈值;shuffle 分区数目是否合理;是否存在大量扫描或全表读取;以及可能出现的倾斜迹象,例如单分区数据量过大。通过这些信息可以推断性能瓶颈并针对性地调整 JOIN 策略、分区数或过滤条件。
  6. 【关键点 1】Spark SQL 查询从 SQL 文本经过解析生成未解析的逻辑计划,其中只是语法树的表示,表名和列名尚未绑定;之后通过分析器结合 Catalog 解析表列信息,生成解析后的逻辑计划,并完成属性绑定和类型检查。
  7. 【关键点 2】随后进入逻辑优化阶段,即优化器对逻辑计划应用一系列规则,如谓词下推、列剪枝、常量折叠、合并相邻操作、算子下推等,生成优化后的逻辑计划。这些规则基于关系代数等价变换,不改变查询结果但显著减少扫描和计算量。
  8. 【关键点 3】优化后的逻辑计划经过规划器转换成物理计划,物理计划会选择合适的执行策略,如选择 join 算法(BroadcastHashJoin、SortMergeJoin、ShuffledHashJoin)、确定 shuffle 分区数、决定是否使用动态分区裁剪或自适应执行。物理计划还可以生成多个候选并基于代价模型估算最优执行粒度