当前位置: 首页 > news >正文

AST(抽象语法树)与 HBO(基于历史的优化)详解

在 Hive SQL 优化中,AST(抽象语法树)HBO(基于历史的优化) 是两种高级优化手段,能够显著提升复杂查询的执行效率。以下是它们的核心原理、应用场景及具体示例:


一、AST(Abstract Syntax Tree,抽象语法树)

1. 什么是 AST?
  • 定义:AST 是 SQL 语句的树形结构表示,由 Hive 解析器生成,反映查询的语法逻辑(如 SELECT、JOIN、WHERE 等操作的嵌套关系)。

  • 作用:Hive 优化器通过遍历和修改 AST,重构查询逻辑,生成更高效的计算路径。

2. AST 优化示例

假设原始 SQL 如下:

SELECT * 
FROM (SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id
) t 
WHERE total > 1000;
  • 原始 AST

    Project (输出字段)
    └─ Filter (total > 1000)└─ SubQueryAlias (t)└─ Aggregate (GROUP BY user_id)└─ TableScan (orders)

  • 优化后 AST(谓词下推):

    Project (输出字段)
    └─ Aggregate (GROUP BY user_id + HAVING total > 1000)└─ TableScan (orders)

    优化效果:将过滤条件 total > 1000 从外层下推到聚合操作中,减少中间数据传输。

3. 常见 AST 优化手段
  • 谓词下推(Predicate Pushdown):将 WHERE 条件提前到数据扫描阶段。

  • 常量折叠(Constant Folding):提前计算常量表达式(如 WHERE age > 30+2 优化为 age > 32)。

  • 子查询扁平化:将多层子查询合并为单层操作(如将嵌套 SELECT 转为 JOIN)。


二、HBO(History-Based Optimization,基于历史的优化)

1. 什么是 HBO?
  • 定义:HBO 通过收集历史执行数据(如统计信息、执行计划性能)动态优化后续查询,属于 基于成本的优化(CBO) 的扩展。

  • 核心依赖

    • 统计信息表大小、列基数(Cardinality)、数据分布(Histogram)等。

    • 执行历史历史任务的资源消耗、Shuffle 数据量、执行时长等。

2. HBO 优化流程
  1. 统计信息收集

    -- 收集表级统计信息(行数、文件大小)
    ANALYZE TABLE orders COMPUTE STATISTICS;
    ​
    -- 收集列级统计信息(最大值、最小值、基数)
    ANALYZE TABLE orders COMPUTE STATISTICS FOR COLUMNS user_id, amount;
  2. 优化器决策

    • 根据统计信息选择最优 JOIN 顺序(小表优先)。

    • 自动选择 Map Join 或 Reduce Join。

  3. 动态调优

    • 根据历史任务的倾斜情况,自动添加随机前缀解决数据倾斜。

3. HBO 应用示例

场景:两表 JOIN(orders 大表,users 小表)。

  • 无 HBO:默认使用 Reduce Join,引发大量 Shuffle。

  • 启用 HBO

    • 统计信息显示 users 表仅 10MB,触发 Map Join

    • 直接将小表广播到所有 Mapper,避免 Shuffle。

    -- 启用自动 Map Join
    SET hive.auto.convert.join=true;
    SET hive.mapjoin.smalltable.filesize=25000000; -- 小表阈值设为25MB
4. HBO 与 CBO 的关系
  • CBO(Cost-Based Optimization):基于统计信息估算执行计划成本(如 CPU、I/O、网络开销),选择最优方案。

  • HBO:在 CBO 基础上,进一步结合历史执行数据(如实际资源消耗)进行动态调整,属于 CBO 的增强版。


三、AST 与 HBO 的综合优化案例

问题 SQL
SELECT a.user_id, a.total 
FROM (SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id
) a 
JOIN (SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id
) b ON a.user_id = b.user_id 
WHERE a.total > 1000;
优化步骤
  1. AST 分析

    • 识别到两个相同的子查询 ab

    • 优化器将子查询合并为 公共表达式(CTE)

    WITH order_summary AS (SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id
    )
    SELECT a.user_id, a.total 
    FROM order_summary a 
    JOIN order_summary b ON a.user_id = b.user_id 
    WHERE a.total > 1000;
  2. HBO 调优

    • 统计信息显示 orders 表的 user_id 基数较高(10万+),且 total 列存在倾斜。

    • 优化器自动为 GROUP BY user_id 添加 DISTRIBUTE BY 分桶,避免 Reducer 长尾。

    SET hive.groupby.skewindata=true; -- 自动处理倾斜

四、总结

优化技术核心原理典型场景
AST重构查询逻辑,减少计算层级和数据传输量多层嵌套子查询、冗余条件过滤
HBO基于统计信息和历史执行数据动态优化执行计划JOIN 顺序选择、数据倾斜自动处理

最终效果

  • 通过 AST 优化,查询执行计划的 Operator 数量减少 40%;

  • 通过 HBO 自动选择 Map Join,Shuffle 数据量降低 90%。

相关文章:

  • 单片机-STM32部分:11、ADC
  • 【C++】 —— 笔试刷题day_27
  • 电影感户外哑光人像自拍摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!
  • AI编程: 使用Trae1小时做成的音视频工具,提取音频并识别文本
  • 扩容 QCOW2 磁盘镜像文件
  • PCB设计实践(十三)PCB设计中差分线间距与线宽设置的深度解析
  • Linux架构篇、第四章_ELK与EFK-7.17.9的日志管理
  • 图像处理篇--- HTTP|RTSP|MJPEG视频流格式
  • 对日开发 TeraTerm ttl脚本开发环境配置
  • 轻松制作高质量视频,实时生成神器LTX-Video重磅登场!
  • PostgreSQL 的 pg_collation_actual_version 函数
  • Redis经典面试题
  • Spring Security 深度解析:打造坚不可摧的用户认证与授权系统
  • 异地多活单元化架构下的微服务体系
  • Docker 使用总结及完整示例介绍
  • 查看Electron 应用的调试端口
  • Docker中运行的Chrome崩溃问题解决
  • Stable Diffusion进阶之Controlnet插件使用
  • HTML属性
  • Lambda表达式解读
  • 体验中国传统文化、采购非遗文创,波兰游客走进上海市群艺馆
  • 阚吉林任重庆市民政局党组书记,原任市委组织部主持日常工作的副部长
  • 逆境之上,万物生长
  • 暴利之下:宠物殡葬行业的冰与火之歌
  • 上海质子重离子医院二期项目启动,有望成为全世界最大粒子治疗中心
  • 2025上海科技节将于5月17日开幕,拟设6大板块专题活动