#分布式SQL
YashanDB的分布式SQL引擎基于Shared-Nothing 架构,内部通过紧耦合达到极致高性能,外部则与存储引擎松耦合,接口可插拔,实现对外的稳定高效响应。
在一个分布式SQL的执行过程中,主要有如下两类实例参与:
协调实例(CN):负责对外提供接口,接收用户请求,生成分布式执行计划,向DN分发查询计划进行执行并汇总执行结果。
数据实例(DN):负责存储数据,并行执行CN下发的执行计划 。
# 分布式SQL执行过程
分布式SQL引擎将用户文本形式的SQL语句进行解析、验证、优化、CN向DN执行计划分发、CN/DN多节点并行执行,并最终返回查询结果集给用户。

session
分布式会话,用于进行节点间的管理,总管节点间执行的最终状态,以及调度节点间的执行过程。
Distributed Internal Network
采用异步网络通讯框架的分布式通信组件,负责节点之间的网络通信,包括CN向DN分发的执行计划,及各节点间的数据交换。
Parser
解析器,负责将用户输入的语句进行词法、语法、语义解析,并生成Parse Tree。解析器采用软解析,在缓存中复用,高频语句高收益。
Verifier
校验器,负责用户角色权限验证,数据合法性检测,语法约束校验等,并将优化器部分工作前置,提前对Parse Tree结构体做优化变形,减少后续环节负担,为性能加速。
Optimizer
优化器,由Parse Tree生成分布式执行计划(plan),并将其切分成可独立运行的计划片段(stages)。
Executor
执行器,负责执行plan(stages)中的算子,YashanDB的分布式SQL引擎采用多级并行执行模式,极大提升了计算效率。
pipeline
并行调度单元。
# 分布式会话管理
在数据库中,会话被用于对应客户端的连接,并隔离不同连接间的用户操作及资源使用。
YashanDB对于用户的分布式SQL的请求,使用分布式会话来进行节点间的管理。
分布式会话总管节点间执行的最终状态,以及调度节点间的执行过程,为用户提供一套统一的接口,简化客户端操作,对用户隔离CN与DN的交互逻辑。
# 优化器
优化器是分布式SQL引擎的核心部件,YashanDB支持CBO(Cost Based Optimizer)模式。
优化器的目标是为SQL语句生成最有效的执行计划传递给执行器,执行计划包含数据访问路径、表连接顺序、PX等执行算子信息。YashanDB的优化器基于统计信息和节点间数据分布信息,计算数据访问和处理所需要的代价,选择代价最低的方案生成分布式执行计划,并将其切分出可以独立执行的计划片段。
分布式执行计划(plan)和计划片段(stages)由CN节点生成,分发到各DN节点,一起协同完成分布式SQL执行。
统计信息
主要包括表、列、索引的统计信息,例如表的行数、列的平均长度、索引包含的列数等。统计信息有动态收集、实时收集、在线收集、定时任务及手动触发等多种收集方式,同时,可通过并行统计、抽样统计等技术加快统计效率,为优化器提供及时更新的信息。
执行算子
算子定义了某一种具体的计算操作,为执行计划的基本组成单元。YashanDB实现了如下几类基本算子:
- 扫描算子
- 表连接算子
- 查询算子
- 排序算子
- 辅助功能算子
- PX并行执行算子
HINT
HINT允许用户对优化器对算子的选择和执行方式提出干预,例如指定表扫描的方式、指定执行顺序、指定并行度等,优化器将根据这些提示,结合统计信息,生成最优的执行计划。
并行度
优化器基于统计信息生成最优的执行计划,有可能因为底层硬件资源(IO限制、内存限制等)的不足而表现并不佳,用户可以根据对硬件环境的观察,在可行时通过HINT指定并行度,让算子多线程并发执行,提高SQL语句执行的整体效率。
# 数据交换机制
分布式数据库里的数据分片(区)存储在不同节点上,当某一个SQL计算的数据源来自于不同片(区)时,需要由特定的PX并行执行算子,将数据按指定方式,搬运到指定位置。
在一个分布式SQL的执行过程中,可能会发生如下几种情形的数据交换:
- DN上的数据向CN上汇聚成分布式SQL的查询结果。
- CN向DN发送要插入或更新的数据。
- 某个DN上的计算需使用其他DN上的数据,需要将其他DN上的数据搬运过来。
- 某个stage向同节点内的其他stage传递数据。
# 并行执行
YashanDB的分布式SQL执行采用典型的MPP架构,分为两级:
第一级:节点间并行
CN上的优化器根据表数据的分布信息,将一个复杂查询分为多个stage,发送到不同的DN,各DN/stage之间并行执行。
第二级:节点内并行
节点内并行执行的切分方式可以分为两类:
水平切分:CN上的优化器切分后产生的stage,在DN上可以根据数据分片信息等将一个stage放到多个pipeline执行,每个pipeline处理一个区间的数据。
垂直切分:在水平切分后,资源仍有结余,仍想继续充分利用CPU多核的能力,可以继续对stage进行垂直切分,切成多份更小的stage进行并行执行。