一、简介
Orca特性
- 模块化
- 可扩展性
- 适应多核
- 可验证性
- 性能
二、预备知识
MPP(大规模并行处理)
- Share-nothing计算结构
- 两个以上的协调处理器
- 每个处理器有自己的内存,OS和硬盘
- Master负责数据库实例之间的工作协调,每部分数据处理和存储的工作称为Segements。
- 当查询提交到master,查询会被优化并拆分为小的部分,并被分发为Segments。
- 通过网络层互联,实现Segments之间的进程间通信。
在查询执行中,数据可以通过多种方式分发到Segments:
- 哈希分发:通过哈希汉书
- 复制分发:全表复制存储到每个实现Segments之间的进程间通信
- 单例分发:全表从多个Segment汇集到一个Host
SQL on Hadoop
- Hive: HiveQL编译为MapReduce作业,需要优化器提高性能
- Pivotal HAWQ: 使用Orca优化器,CBO优化
- 其他:Cloudera的Impala,Facebook的Presto,只支持部分SQL标准,只有RBO(写作这篇论文时的情况)
三、ORCA架构
Orca是一个现代的自顶向下的,基于Cascades优化框架的查询优化器。Orca和数据库系统是松耦合的,这样它可以支持不同的计算架构(如MPP和Hadoop)。
DXL
Data eXchange Language,优化器和数据库系统之间的通讯协议。分为三种:DXL Query, DXL MD, DXL Plan。
Memo
优化器生成的所有可行计划的空间被编码到内存中叫做Memo的数据结构中。Memo数据结构由一系列叫做groups的容器组成,每个group包含逻辑等价的表达式。不同的Memo Group表达不同的查询子目标(如表的filter,两个表的join)。Group成员叫做group expression,通过不同的逻辑方式达成group的目标(如join的不同顺序)。每个group expression是一个包含其他group作为它的子女的操作符,所以这是一个递归的结构。
搜索机制和作业调度器
Orca利用一个搜索机制来探索所有可行计划的空间,并找到具有最小估算代价的计划。
搜索机制通过作业调度器实现,它创建独立、并行的工作单元,并通过以下三个步骤实现查询优化:
- exploration:生成等价的logical expressions
- implementation:生成物理计划
- optimization:强制必须的物理属性(如排序顺序),计算所有可行计划的代价
变换
可行计划的生成是通过应用变换规则:
- 生成等价的逻辑表达式(如InnerJoin(A, B) => InnerJoin(B, A))
- 现有表达式的物理实现(如Join(A, B) => HashJoin(A, B))
应用变换规则的结果被复制到Memo,结果可能三创建新的group,或者添加新的group expression到现有的group。
属性强制
描述查询需求和计划特征的可扩展的框架,通过属性指定实现。
- 逻辑属性:如输出列
- 物理属性:如排序顺序和数据分布
- 标量属性:如join条件中使用的列
在查询优化中,每个操作符会要求子女的特定属性,优化后的子计划或者自己满足这个属性(如IndexScan计划提供排序后的数据),或者需要在计划中插入一个enforcer(如排序操作符)以提供需要的属性。
元数据缓存
元数据的变化并不频繁,每次查询元数据都有开销。Orca把元数据在优化器端做了缓存,旨在缓存中无法取到元数据或者元数据改变的时候才会从catalog中读取。元数据缓存同时抽象了数据库系统的细节,方便测试和调试。
GPOS
一个OS抽象曾,用于Orca和外部操作系统交互,包括一个内存管理器,以及一些原语:
- 并发控制
- 异常处理
- 文件I/O
- 同步数据结构