这是我参与「第四届青训营 」笔记创作活动的第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 及其常见的优化规则。