常见的查询优化器——RBO | 青训营笔记

160 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

第一节课「SQL Optimizer 解析」的内容主要包含 4 个方面:大数据体系和 SQL、常见的查询优化器、查询优化器的社区开源实践、SQL 相关的前沿趋势。这篇文章为常见的查询优化器 Rule-based Optimizer (RBO) 。

查询优化器分类

  • Top-down Optimizer

    • 从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划
    • 例子: Volcano/Cascade, SQL Server
  • Bottom-up Optimizer

    • 从零开始,由下往上遍历计划树,找到完整的执行计划
    • 例子: System R, PostgreSQL, IBM DB2
  • Rule-based Optimizer, RBO

    • 根据关系代数等价语义,重写查询
    • 基于启发式规则
    • 会访问表的元信息 (catalog),不会涉及具体的表数据 (data)
  • Cost-based Optimizer, CBO

    • 使用一个模型估算执行计划的代价,选择代价最小的执行计划

RBO

  • 基于关系代数等价规则对逻辑计划进行变换
  • 实现上
    • Pattern:定义了特定结构的 Operator 子树(结构)
    • Rule:定义了如何将其匹配的节点替换 (Substitute) 为新形态,从而生成新的、等价的 Operator 树(原地替换
    • 优化器搜索过程被抽象为不断匹配 Pattern 然后应用 Rule 转换,直到没有可以匹配的 Rule
  • 局限性
    • 无法解决多表连接问题
    • 无法确定和选择最优的分布式 Join/Aggregate 执行方式

优化原则

  • Read data less and faster (I/O)
  • Transfer data less and faster (Network)
  • Process data less and faster (CPU & Memory)

优化规则

SELECT pv.siteId, user.name 
FROM pv JOIN user
ON pv.siteId = user.siteId AND pv.userId = user.id 
WHERE user.siteId > 123;

注:具体图示细节见 SQL 查询优化器浅析 周东炎 ppt.pptx - 飞书云文档

  • 列裁剪

SELECT pv.siteId, user.name

FROM pv JOIN user

ON pv.siteId = user.siteId AND pv.userId = user.id

WHERE user.siteId > 123;

  • 谓词下推

SELECT pv.siteId, user.name

FROM pv JOIN user

ON pv.siteId = user.siteId AND pv.userId = user.id

WHERE user.siteId > 123;

  • 传递闭包

SELECT pv.siteId, user.name

FROM pv JOIN user

ON pv.siteId = user.siteId AND pv.userId = user.id

WHERE user.siteId > 123;

  • Runtime Filter(min-max filter,in-list filter,bloom filter)
  • Join 消除
  • 谓词合并

个人总结

了解了查询优化器 RBO 及其常见的优化规则。

参考