# SQL 的 Parse 与 Compile

__*解析*__
__*Parse*__
__*SQL 的 Parse*__
__*编译*__
__*Compile*__
__*SQL 的 Compile*__
__*点查询询询询询询*__
__*PointGet*__

![left](./student-guide/diagram/SQLParseandCompile_aa_002_20220512.png)
-------------------------------------------------------------
TiDB Server 的 Protocol Layer 监听到客户端发来的 SQL 以后,开始对 SQL 文本进行处理,最先做的是从 PD 获取异步获取 SQL 语句的 start_ts , 也就是 SQL 语句开始的 TSO,之后,分别会经过 Parse（解析）和 Compile（编译）两个模块,最终产生执行计划传递给 Executor（执行器）模块。下面分别进行介绍。

1. 异步读取到当前 SQL 开始执行的 TSO,即 start_ts 信息,这个读取是通过 PD Client 模块完成的。具体的读取流程,请参考:PD 章节的 TSO 读取。

2. Parse 模块
之前在 TiDB Server 课程中介绍过,Parse 模块使用法分析器 lex 和语法分析器 yacc 将 SQL 转化为抽象语法树（ AST ）,这个抽象语法树（AST）被传递到 Compile 模块。

3. Compile 模块
AST 被 Compile 模块接收到以后,先进入 Preprocess 流程,这里主要是进行预处理,语句的合法化检验和名称的绑定。
另外,Preprocess 流程之后会做一个判断,如果 SQL 语句只读取一行数据（点查询询询询询询）,例如以唯一索引或者主键索引作为查询条件的 select / update / delete 等语句,那么这条语句将不传递给后面的 Optimize（优化） 流程生成执行计划,而是直接执行来获取数据,从而节约 Optimize（优化） 的成本,这个优化叫做 PointGet。

如果语句没有做 PointGet 优化,则会进入 Optimize 流程,这个流程就是我们常说的优化,目前分为 2 部分:（1）逻辑优化,主要依据关系代数的等价交换规则做一些逻辑变换。（2）物理优化,基于逻辑优化结果,结合统计信息,选择物理算子和最优执行路径。关于优化流程,逻辑优化和物理优化,我们会在 TiDB 性能优化的课程中进行详细说明。

经过 Optimize 流程后,最终我们会得到执行计划,有了执行计划,我们便可以到存储引擎中去存取数据了。