# SQL 语句的 Parse 与 Compile

![`smart`](SQLParseandCompile_aa_005_20220512.png)
-------------------------------------------------------------
TiDB server 的 Protocol Layer 监听到客户端发来的 SQL 语句以后, 开始对 SQL 语句的文本进行处理, 最先做的是从 PD 异步获取 SQL 语句的 start_ts, 也就是 SQL 语句开始的 TSO, 之后, 分别会经过 Parse 和 Compile 两个模块, 最终产生执行计划传递给 Executor 模块。

1. 异步读取到当前 SQL 语句开始执行的 TSO, 即 start_ts 信息, 这个读取是通过 PD Client 模块完成的。

2. Parse 模块使用法分析器 lex 和语法分析器 yacc 将 SQL 语句转化为抽象语法树（AST）, 这个抽象语法树被传递到 Compile 模块。

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

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

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

