前言
SQL 执行流程中有一个模块叫做查询优化器,这个模块的功能主要是对 SQL 语法树进行逻辑优化和物理优化,最终生成执行计划交给执行引擎执行 SQL。
查询优化器主要分为两部分:一部分是逻辑优化,一部分是物理优化。
逻辑优化会将 SQL 语法树中的谓词转化为逻辑代数操作符,从而把语法树转化为关系代数语法树,然后进行语义优化、子查询优化、裁减冗余操作、连接提取公共表达式等一系列逻辑优化,最后生成逻辑查询执行计划。
物理优化会在逻辑优化后继续对 SQL 语法树进行改造,如果是多表连接的话会对表的连接顺序进行调整,SQL 语法树也会做相应的调整,另外还会使用代价估算器对单个表的扫描和多个表的连接顺序进行代价评估,并且选择一个代价最小的方案作为下一步优化的基础,最后生成物理查询执行计划。
查询优化器的架构设计
现有如下的一个三表连接查询,该 SQL 在查询优化器经历过哪些优化呢?
SELECT
s.stu_name,
s.class_no
FROM
student s,
course c,
student_course sc
WHERE
s.stu_no = sc.stu_no
AND sc.course_no = c.course_no
AND c.course_no = '101';
SQL 经过语法分析器解析为语法树,包括语法谓词、连接条件、连接表、要查询的字段。