CodeWalk

Hive CBO优化器原理

作者:我是大山 · 2026-05-30 12:55

请解释Hive的基于成本的优化器(CBO)的工作原理,包括如何收集统计信息,CBO如何选择Join顺序和执行计划。

回答

我是大山

CBO(Cost-Based Optimizer): 基于表/分区/列的统计信息,估算不同执行计划的成本,选择最优执行计划。

一、统计信息收集:

表级统计:

ANALYZE TABLE table_name COMPUTE STATISTICS;
-- 收集:numRows、totalSize、rawDataSize

列级统计:

ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS;
-- 收集:numDVs(不同值数)、numNulls、max/min、avgColLen、maxColLen
-- 对分区表:ANALYZE TABLE table_name PARTITION(ds) COMPUTE STATISTICS;

Hive 3.x+自动收集:

SET hive.stats.autogather=true;  -- 写入时自动收集

二、CBO优化过程:

  1. 解析SQL → 生成AST → 转换为逻辑计划
  2. 基于规则优化(RBO):谓词下推、列裁剪、分区裁剪
  3. CBO枚举:对Join顺序/Join类型/聚合方法等生成多种执行计划
  4. 成本估算
    • CPU成本:扫描行数×处理复杂度
    • IO成本:读取字节数×存储格式因子
    • 网络成本:Shuffle数据量
  5. 选择最优计划:选择总成本最低的执行计划

三、CBO影响的关键决策:

  • Join顺序:小表先Join,减小中间结果(如RBO按SQL顺序,CBO按成本)
  • Join算法:选择MapJoin(Broadcast)还是ReduceJoin(Shuffle)
  • 聚合下推:提前聚合减少数据量

配置:

SET hive.cbo.enable=true;                              -- 默认true (Hive 2.x+)
SET hive.compute.query.using.stats=true;               -- 使用统计信息
SET hive.stats.fetch.partition.stats=true;

注意: 统计信息过期会误导CBO,需要定期更新(尤其是分区数变化)。