Volcano Optimizer
简介:提供了一套sql解析与执行接口,包含sql查询和执行相关任务的执行代码,只需将数据模型插入到sql解析工具Calcite中,就可以得到SQL查询能力
SQL查询优化
- 基于关系代数模型
- 本质:对关系代数的优化
一、多个表根据共同点整合出特定列,通过只读取此列,高效读取,优化SQL查询
- 只查找对应值所在区域,符合条件的数据匹配处理。避免独步不相关数据,极大减少IO和提高性能
关系代数进行查询优化的要点:
- SQL 查询可以表示成关系代数
- 关系代数作为一种树形的结构,实质上也可以表示查询的物理实现方案流程
- 关系代数可以进行局部的等价变换,变换前后返回的结果不变但执行的成本不同
- 通过寻找执行成本最低的关系代数表示,我们就可以将一个 SQL 查询优化成更为高效的方案
实现关系代数的化简和优化,依赖于数据系统的物理性质,如
- 储存设备的特性(顺序读性能如何?随机读性能如何?吞吐量如何)
- 储存内容的格式和排列(列式储存?行式储存?是否以某列进行分片?)
- 包含的元数据和预计算结果(是否存在索引?是否存在物化视图?)
- 聚合和计算单元的特性(单线程?并发计算?分布式计算?特殊加速硬件?)
二、SQL查询优化的基础算法
- 结构匹配和替换
- 先在关系代数结构上匹配局部结构,再根据机构特点进行其他操作(变换、替换)
- 内部变换,但外部接口需要保持一致性
- 向上输出的数据内容和类型不变
- 下层接受输入的数量和类型不变
- 基于成本的优化算法volcano Optimizer
- 局部区域的计算成本和总成本成正比
- 动态规划算法与等价集合
- Calcite 采用了最简单的递归将子树的内容打印成字符串的方法进行 Hash 和比较。 因此在使用 Calcite 时要注意正确实现 RelNode 类的 getDigest 方法。保证将节点的各种属性包含在内, 防止不同的节点被认为等价
- 广度优先搜索与启发式算法
- 广度优先:自根节点起向下遍历执行搜索任务
- Volcano Optimizer 支持三种算法终止条件
- 时钟: 使用最大迭代计数或最大物理执行时间作为限制
- 成本阈值: 当优化方案的成本低于某个阈值是结束算法(相比原始成本或固定值)
- 规则穷尽: 当无法再应用规则获得新的关系代数结构的时候结束算法