# SQL 的 Parse 与 Compile

![center](./student-guide/diagram/05-Parse-AND-Compile-01-01.png)
-------------------------------------------------------------
TiDB Server 的 Protocol Layer 监听到客户端发来的 SQL 以后，开始对 SQL 文本进行处理，最先做的是从 PD 获取异步获取 SQL 语句的 start_ts , 也就是 SQL 语句开始的 TSO，之后，分别会经过 Parse（解析）和 Compile（编译）两个模块，最终产生执行计划传递给 Executor（执行器）模块。下面分别进行介绍。
  - 异步读取到当前 SQL 开始执行的 TSO，即 start_ts 信息，这个读取是通过 PD Client 模块完成的。具体的读取流程，请参考：PD 章节的 TSO 读取。
  - Parse 模块
    之前在 TiDB Server 课程中介绍过，Parse 模块使用法分析器 lex 和语法分析器 yacc 将 SQL 转化为抽象语法树（ AST ），这个抽象语法树（AST）被传递到 Compile 模块。
  - Compile 模块

AST 被 Compile 模块接收到以后，先进入 Preprocess 流程，这里主要是进行预处理，语句的合法化检验和名称的绑定。

另外，Preprocess 流程之后会做一个判断，如果 SQL 语句只读取一行数据（点查询），例如以唯一索引或者主键索引作为查询条件的 select / update / delete 等语句，那么这条语句将不传递给后面的 Optimize（优化） 流程生成执行计划，而是直接执行来获取数据，从而节约 Optimize（优化） 的成本，这个优化叫做 PointGet。

如果语句没有做 PointGet 优化，则会进入 Optimize 流程，这个流程就是我们常说的优化，目前分为 2 部分：（1）逻辑优化，主要依据关系代数的等价交换规则做一些逻辑变换。（2）物理优化，基于逻辑优化结果，结合统计信息，选择物理算子和最优执行路径。关于优化流程，逻辑优化和物理优化，我们会在查询优化的章节进行详细说明。
经过 Optimize 流程后，最终我们会得到执行计划，有了执行计划，我们便可以到存储引擎中去存取数据了。

