# 解析和编译SQL语句

![`smart`](SQLParseandCompile_aa_003_20220512.png)

-----------------------------------------------------------
当TiDB服务器的协议层接收到客户端程序发送的SQL语句后，它开始处理SQL语句的文本。它首先要做的是异步从PD获取SQL语句的start_ts，即SQL语句开始时的TSO。之后，它将分别经过Parse和Compile模块，最终生成一个执行计划传递给Executor模块。

1. 当当前的SQL语句开始执行时，异步读取TSO，即start_ts信息，这是由PD客户端模块完成的。

2. Parse 模块使用词法分析器和 yacc 解析器将 SQL 语句转换为抽象语法树（AST），然后将其传递给 Compile 模块。

3. 收到AST之后，它首先进入预处理过程，主要执行预处理、语句合法性检查和名称绑定。此外，在预处理过程之后，将会做出一个决定：
- 如果SQL语句只读取一行数据（PointGet），比如使用唯一索引或主键索引作为查询条件的SQL操作，那么这个语句将不会被传递到后续的优化过程中生成执行计划，而是直接执行以获取数据，从而节省优化过程的成本。这种优化被称为PointGet。
- 如果SQL语句没有经过PointGet优化，它将进入优化过程，分为两部分。
  - 逻辑优化，主要基于关系代数的等价交换规则进行一些逻辑变换。
  - 物理优化，基于逻辑优化结果，结合统计信息，选择物理操作符和最优执行路径。关于优化过程，逻辑优化和物理优化，我们将在TiDB性能优化课程中详细解释。

经过优化过程，最终生成了物理执行计划。有了物理执行计划，TiDB服务器就可以执行它，并访问存储引擎中的数据。

