OceanBase OBServer节点的SQL层将用户的SQL请求转化成对一个或多个Tablet的数据访问。SQL层会按照以下顺序经过一系列组件来处理一个SQL:
Parser -->Resolver-->Transformer-->Optimizer-->CodeGenerator-->Executor。
视频讲解如下 |
---|
【赵渝强老师】OceanBase OBServer节点的SQL层 |
其中:
-
Parser
该组件负责词法或语法解析。将用户的SQL分成一个个的"Token",并根据预先设定好的语法规则解析整个请求,转换成语法树(Syntax Tree)。 -
Resolver
该组件负责语义解析。根据数据库元信息,将SQL请求中的Token翻译成对应的对象(例如库、表、列、索引等),生成的数据结构叫做Statement Tree。 -
Transformer
该组件负责逻辑改写。根据内部的规则或代价模型,将SQL改写为与之等价的其他形式,并将其提供给后续的优化器做进一步的优化。 -
Optimizer(优化器)
该组件根据数据库的统计信息为SQL请求生成最佳的执行计划。SQL层的执行计划分为本地、远程和分布式三种:
1. 本地执行计划:只访问本服务器的数据。
2. 远程执行计划:只访问非本地的一台服务器的数据。
3. 分布式执行计划:会访问超过一台服务器的数据,执行计划会分成多个子计划在多个服务器上执行。 -
Code Generator(代码生成器)
该组件将执行计划转换为可执行的代码,但是不做任何优化选择。 -
Executor(执行器)
该组件启动SQL的执行过程。
下图展示了SQL层执行SQL的过程。
在标准的SQL流程之外,SQL层还有Plan Cache能力,将历史的执行计划缓存在内存中,后续的执行可以反复执行这个计划,避免了重复查询优化的过程。