订阅更新

Hive CBO 为什么依赖统计信息?

面试问 197 约 2 分钟读完

本文目录
  1. 面试怎么回答
  2. CBO 先估算中间结果规模
  3. Join 顺序对分布式成本影响很大
  4. 统计错误会导致连锁误判
  5. 收集统计也要控制范围和时机
  6. 用 EXPLAIN 对比估算与实际
  7. 统计不是万能真相
  8. 参考资料

面试怎么回答

Hive CBO 需要用表行数、文件大小、列 NDV、NULL 数和最小最大值等统计估算过滤与 Join 后的基数,再比较 Join 顺序、算法和 Shuffle 成本。统计缺失或过期会造成广播大表、错误 Join 顺序等问题。我会在分区产出后增量收集关键统计,并用 EXPLAIN 和实际运行指标校准估算。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

SQL 没改、数据量也差不多,执行计划却突然把大表当成小表去做 Map Join。

CBO 做的是成本比较;如果表行数、NDV 和边界统计不可信,再聪明的优化器也只能用错误输入做决定。

Hive CBO 用表级与列级统计估算每个算子的基数和成本,再决定 Join 顺序、Join 算法等计划;统计缺失或过期会让估算误差层层放大。

CBO 先估算中间结果规模

过滤会剩多少行、两个表 Join 后会膨胀还是收缩,决定了 Shuffle、内存和 CPU 成本。表行数、文件大小、列的 NDV、NULL 数、最小最大值等统计,为选择率和基数估算提供基础。

Join 顺序对分布式成本影响很大

多表关联若先产生巨大中间结果,会带来更多 Shuffle 和落盘;若先用高选择性条件缩小数据,再关联大表,成本可能低很多。Calcite CBO 会比较候选计划,但依赖统计判断哪一侧更小、过滤是否有效。

统计信息如何影响 Hive 执行计划

统计错误会导致连锁误判

分区新增后未收集统计,CBO 可能低估表规模;NDV 过期会错估 Join 基数;数据倾斜和字段相关性也会让独立假设失真。一次低估可能进一步影响广播、Join 顺序、Reducer 数和内存分配。

收集统计也要控制范围和时机

全表频繁 ANALYZE 成本很高。分区表应在新分区产出后收集增量统计,并定期校验汇总;高频参与过滤和 Join 的关键列优先收集列统计。大规模回刷、Schema 变更和数据分布突变后,要触发重新分析。

用 EXPLAIN 对比估算与实际

查看 CBO 计划、各节点估算行数和 Join 选择;结合执行时实际计数、Shuffle 大小和倾斜判断误差来自哪里。不要遇到坏计划就永久写 Hint,先确认统计是否缺失、分区是否被正确裁剪、谓词是否能下推。

统计不是万能真相

直方图、相关列、极端热点 Key 和复杂 UDF 仍可能难以估算。对稳定关键任务可以保留 Hint 或固定策略作为兜底,但要记录原因并周期复核,避免数据分布变化后原来的 Hint 反而变成瓶颈。

参考资料

刷题进度保存在当前浏览器