特性概述
优化器是SQL引擎的重要组成部分。在SQL引擎中,原始SQL语句通常会先经过解析器解析生成一棵查询树(QueryTree),然后由优化器对查询树进行逻辑优化和物理优化,最终生成执行器可以实际执行的查询计划(Plan)。其中,逻辑优化主要发生在优化器的规则模型中,因此也称为Rule-Based Optimizer(简称RBO),其主要功能是基于启发式规则对查询树进行改写,使其变成一条等价但可能执行效率更好的SQL。而物理优化则发生在优化器的代价模型中,也称为Cost-Based Optimizer(简称CBO),其主要功能是基于查询树生成不同的执行路径(Path)并根据代价估算选择一种执行方式,如:对于同一张表的访问方式是全表扫描还是索引扫描,不同表的连接方式是Nestloop Join、Hash Join还是Merge Join等。
一条SQL通常能够生成很多可以选择的路径,CBO需要依赖统计信息和代价模型计算每条可选路径的代价,并从中选择代价最小的路径作为最终的执行路径。CBO在SQL引擎中的位置如图1所示:
本特性重点关注CBO(Cost-Based Optimizer)在SQL引擎中的逻辑实现原理,其主要组成包括:统计信息、扫描路径与连接路径生成、代价估算与计划选择。扫描路径和连接路径决定了SQL在执行器阶段的具体执行方式,而统计信息和代价估算则决定了如何在生成的多条路径中选出代价更好的执行方式。
