#SQL执行流程
在实际了解调优之前,需要大致了解SQL语句的执行流程,知晓SQL语句如何从输入的字符串一步步转换成最终的执行结果。
从客户端输入SQL语句到向客户端输出结果,SQL引擎将依次进行解析、优化、执行等多个步骤处理。
# Parse&Verify解析与校验
SQL执行的第一阶段解析与校验。其中解析分为软解析和硬解析两种方式:
根据客户端输入SQL语句的HASH值,在shared pool的计划缓存中查看是否存在副本,存在副本则重用查询计划,直接跳到执行阶段,即“软解析”。
若shared pool的计划缓存中不存在副本则进行硬解析,对SQL进行分词,生成系统能够识别的抽象语法树,并对语法树进行校验:
- 校验Table,查看Table是否能正常访问,以及校验权限等问题。
- 校验Filter过滤条件,包括过滤条件里面的column信息是否能在表中找到等。
- 校验Columns查看每个column的节点,查看函数是否是内置函数或者外部声明函数,以及每个节点里面带着的filter情况。
Note:
SQL引擎始终对DDL执行硬解析。
# Rewrite语句重写
在解析与校验完成后,SQL引擎会根据特定关系代数规则,将抽象语法树改写为另外一种等价的逻辑描述树,使之更容易被优化。
重写对于非常复杂的查询(包括那些包含许多子查询或许多连接的查询)而言特别重要,查询生成器工具通常会创建这些很复杂的查询。 YashanDB内部存在多种规则的语句重写,大体包括如下几类:
- 子查询改写
- 谓词下推
- 谓词组合优化
关于改写和谓词相关的优化的详细介绍见查询改写与谓词优化。
# Optimize优化
在Optimize阶段会生成逻辑计划,并根据查询中的引用对象和条件,在考虑多方面因素后确定最有效的执行计划,例如确定Join Orders、选择率计算等,然后再根据相应规则转化成物理计划。
生成执行计划是处理任何SQL的必要步骤,将在很大程度上影响执行时间。
# Execute执行
SQL引擎器使用一系列的算法组织和处理数据,比较典型的有排序、连接、表扫描、汇聚等,这些算法称为执行算子。优化器在Optimize阶段搭积木般组合各种算子,最后生成执行计划,执行器则根据计划逐步执行算子,最后生成数据。