OceanBase SQL物理运算符详细设计
编号
文档版本
修订章节
修订原因
修订日期
修订人
1
新建文档
2012/4/24
竹翁
天官
2
增加Distinct运算符;HashGroupBy中增加对支持count(distinct)的说明
2012/4/24
竹翁
3
增加集合运算符;增加外排或Hash桶转储时的外存文件结构描述;MergeDistinct功能由Sort运算符实现;讨论后的其他细节修订;各内存结构之间访问使用指针;
2012/5/2
天官、
竹翁
4
5
6
目录
1 目标 3
2 名词解释 3
3 物理运算符接口 3
4 查询转换实例 6
5 物理运算符 8
TableScan 8
Filter 8
Limit 8
Project 9
Sort 9
数据收集阶段 9
输出阶段 12
Scalar Aggregate 13
GroupBy 13
MergeGroupBy 13
HashGroupBy 13
Distinct 15
MergeDistinct 15
HashDistinct 15
Join 16
MergeJoin 16
Union 21
MergeUnion 22
Intersect 24
Except 25
附录 26
CS端的TabletScan伪代码 26
MS上TableScan的伪代码 36
GroupBy接口的伪代码 39
MergeGroupBy的伪代码 40
HashGroupBy的伪代码 41
Join操作接口伪代码 42
本文档是淘宝OceanBase( http://oceanbase. )开源数据库中执行SQL查询时所需物理运算符的详细设计。
目标
OceanBase要全面支持SQL。为了支持SQL查询,在进行SQL解析优化之后,查询处理器要生成物理执行计划(Physical Query Plan)。物理查询计划是由若干物理运算符(Physical Operator)组成的树形结构。本文定义了物理运算符的接口,并包含所有物理运算符的详细设计。
名词解释
Update Server:OceanBase的增量更新子系统,记录用户的修改,通常由一主一备或一主多备构成;简写为UPS;
ChunkServer:OceanBase的基线数据存储子系统,由多台机器构成,基线数据通常保存2~3副本并且保存在不同的ChunkServer上;简写为CS;
MergeServer:OceanBase的用户接口子系统,接收用户的查询请求,并从对应ChunkServer上获得基线数据以及从UpdateServer上获得更新的增量,然后融合二者后返回用户;简写为MS;
RootServer:OceanBase的管理服务器,用于管理UpdateServer、ChunkServer和MergeServer等;简写为RS;
列:一个列由列ID(column_id)及其值(column_value)组成;
行:一个行由若干列组成,有些时候其中的部分列构成主键(row key)并且整个表按主键顺序存储,有些表,如select指令的结果,可以不包含主键;
schema:表的列的类型、值范围等以及该表与其他表的join等关系称为表的schema;
表:一个表由若干列(在schema中定义)和任意行组成,有些表的每一行都存储了schema中定义的每一列,这样的表是稠密的,如静态(基线)数据的表一般是稠密的;另外一些表行只存储了部分的列,例如UpdateServer中的表的修改增量,这样的表是稀疏的。
物理运算符接口
所有物理运算符都要遵循相同的接口。通过get_next_row方法,可以获得该物理运算符输出的下一行数据。输出是行可以作为下一个物理运算符的输入,也可以直接作为查询结果输出。
/// 一个行可以包含的最大元素/列数
static const int64_t OB_ROW_MAX_COLUMNS_COUNT = 512;
/**
* 行描述
*
*/
class ObRowDesc
{
public:
/**
* 根据表ID和列ID获得该列在元素数组中的下标
*
* ***@param table_id 表ID
* ***@param column_id 列ID
* ***@param [out] 该
OceanBaseSQL物理运算符详细设计 来自淘豆网www.taodocs.com转载请标明出处.