YashanDB SQL 引擎

简介: YashanDB SQL 引擎

SQL 引擎是数据库核心部件之一,其核心职责是处理客户端提交的文本形式的 SQL 请求并执行,以及在必要时返回查询结果集给客户。

SQL 执行过程

一次完整的 SQL 执行过程包括解析、验证、优化和执行四个阶段,其中优化阶段又分为静态重写、生成执行计划以及动态重写三部分。

Parse 阶段

解析阶段,进行词法、语法、语义解析,并生成树状的解析结果 Parse Tree。

Verify 阶段

校验阶段,进行用户角色权限验证、数据合法性检测、语法约束校验等,并将优化器部分工作前置,提前对 Parse Tree 结构体做优化变形,减少后续环节负担,为性能加速。

Optimize 阶段

优化阶段,根据输入的 Parse Tree 生成最终的可执行的计划 SQL execution plan。

Execute 阶段

执行阶段,执行 SQL execution plan 中的算子,支持并行计算以提升效率。

优化器

优化器是 SQL 引擎的核心部件,YashanDB 优化器采用 CBO(Cost Based Optimizer)优化模式。

优化器根据输入的 Parse Tree,尽可能生成最优执行计划,并作为输入由执行器完成后续执行过程。执行计划包含数据访问路径、表连接顺序等执行算子信息。YashanDB 的 CBO 优化器基于统计信息,计算数据访问和处理所需要的代价,选择最优方案生成执行计划。

统计信息

主要包括表、列、索引的统计信息,例如表的行数、列的平均长度、索引包含的列数等。统计信息有动态收集、定时任务及手动触发等多种收集方式,同时,可通过并行统计、抽样统计等技术加快统计效率,为优化器提供及时更新的信息。

执行算子

算子定义了某一类具体的计算操作,是执行计划的基本组成单元。YashanDB 实现了如下几种基本算子:

扫描算子

表连接算子

查询算子

排序算子

辅助功能算子

PX 并行执行算子

HINT

HINT 是提供给用户对 SQL 执行计划进行干预的措施,例如指定表扫描的方式、指定执行顺序、指定并行度等,优化器将根据这些提示,结合统计信息,生成最优的执行计划。

并行度

并行度描述 SQL 执行时并行处理程度,可以通过参数或 HINT 指定并行度,干预 SQL 执行时采取多线程并发执行,提高 SQL 语句执行效率。

向量化计算

YashanDB 支持向量化计算,核心原理是利用 SIMD(Single Instruction Multiple Data)技术进行批量计算,提高计算效率。

向量化计算的内容包括:

批处理:算子间传递数据不再是一条一条记录,而是一批数据。

并行计算:算子并发执行。

向量化计算框架包括:

向量:算子之间传递的数据结构,由一批连续内存存储、数据类型相同、长度已知的列数据组成。

表达式:通用表达式,例如字面量(Literal)、列(Column)、函数(Function)等,通过建立计算表达式结构体,将其绑定执行所需的上下文信息、Schema 生成已绑定可执行表达式,再进行计算。

执行算子:算子是 SQL 中将查询计划具体执行的功能单位,将输入向量数据处理后输出结果,结果也是向量数据。

分布式 SQL 执行过程

在一个分布式 SQL 的执行过程中,主要有如下两类实例参与:

协调实例(CN):负责对外提供接口,接收用户请求,生成分布式执行计划,向 DN 分发查询计划进行执行并汇总执行结果。

数据实例(DN):负责存储数据,并行执行 CN 下发的执行计划。

分布式 SQL 引擎将用户文本形式的 SQL 语句进行解析、验证、优化、CN 向 DN 分发执行计划、CN/DN 多节点并行执行,并最终返回查询结果集给用户。

session

会话管理,用于进行节点间的管理,总管节点间执行的最终状态,以及调度节点间的执行过程。

Distributed Interconnect Bus

采用异步网络通讯框架的分布式通信组件,负责节点之间的网络通信,包括 CN 向 DN 分发的执行计划,以及各节点间的数据交换。

数据交换机制

分布式数据库里的数据分片(区)存储在不同节点上,当某一个 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 进行并行执行。

目录
打赏
0
0
0
0
98
分享
相关文章
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
25天前
|
SQL
【YashanDB知识库】like 变量的SQL语句应用程序执行效率低与yasql执行效率高
【YashanDB知识库】like 变量的SQL语句应用程序执行效率低与yasql执行效率高
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
12天前
|
SQL
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB知识库】由于hist_headanalyzetimetab中analyze time导致的sql语句执行慢
【YashanDB知识库】由于hist_headanalyzetimetab中analyze time导致的sql语句执行慢
【YashanDB知识库】如何将mysql含有group by的SQL转换成崖山支持的SQL
本文探讨了在YashanDB(崖山数据库)中执行某些SQL语句时出现的报错问题,对比了MySQL的成功执行结果。问题源于SQL-92标准对非聚合列的严格限制,要求这些列必须出现在GROUP BY子句中,而SQL:1999及更高版本允许非聚合列直接出现在选择列中。YashanDB和Oracle遵循SQL-92标准,因此会报错。文章提供了两种解决方法:使用聚合函数处理非聚合列,或将GROUP BY与ORDER BY拆分为两层查询。最后总结指出,SQL-92标准更为严谨合理,建议开发者遵循此规范以避免潜在问题。
【YashanDB知识库】使用c-调用yashandb odbc驱动执行SQL时报YAS-08008 not all variables bounded
本文来自YashanDB官网,讨论了某客户在使用C# ASP.NET应用时遇到的异常问题。问题表现为YashanDB ODBC驱动不支持.NET框架通过绑定变量执行SQL语句,导致应用无法正常运行。该问题影响所有YashanDB版本及其ODBC驱动版本。解决方法包括避免使用绑定变量或升级ODBC驱动版本。文章通过示例代码展示了问题复现过程,并总结了最小化问题场景以定位和解决问题的经验。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等