查询优化器在逻辑优化阶段主要解决的问题是如何找出SQL语句等价的变换形式,使得SQL执行更高效。
查询优化技术的理论基础
关系代数
1970年,E.F.Codd在题为《A Relation Model of Data for Shard Data Banks》的论文中提出了数据的关系模型的概念。Codd提议将关系代数作为数据库查询语言的基础。关系数据库的对外接口是SQL语句,所以SQL语句中的DML,DQL基于关系代数实现了关系的运算。

作为数据库查询语言的基础,关系模型由关系数据结构,关系操作集合和关系完整性约束三部分组成。
关系是一种对象,关系的另外一个常用词是表。关系更偏向理论,表更关注实际数据库中的增删改查等操作的对象
关系的元数据即表的结构,通常称为列和属性,有的用filed或者item来表示,关系的数据即表的行数,通常称为元组tuple,也称为记录record,一个表有多行元组。
对关系进行的操作就是关系运算。关系运算是将一定的运算符作用于一定的关系对象上,得到预期的运算结果。运算对象,运算符,运算结果是运算的三大要素,所以关系运算就是关系运算符作用在关系上,得到的结果形式也是关系形式的操作。
常用的关系代数的运算符包括以下4类
传统集合运算符。并(UNION),交(INTERSECTION),差(DIFFERENCE),积(EXTENDED CARTESIAN PRODUCT).
专门的关系运算符。选择(SELECT),投影(PROJECT),连接(JOIN),除(DIVIDE).
辅助运算符。用来辅助专门的关系运算符进行操作的,包括算法比较符和逻辑运算符。

关系代数等价变换规则对优化的指导意义
关系代数表达式的等价:也就是说相同的关系代数代替两个表达式中相应的关系,所得到的结果是相同的。两个关系表达式E1和E2是等价的,记为E1≡E2(恒等于)
查询语句可以表示为一颗二叉树
叶子是关系
内部节点是运算符(或称算子,操作符,如LEFT OUTER JOIN),表示左右子树的运算方式。
子树是表达式或SQL片段
根节点是最后运算的操作符,根节点运算之后,得到的是SQL查询优化的结果。这样一课树就是就是一个查询的路径
多个关系连接,连接的顺序不同,可以得出多个类似的二叉树。
查询优化就是找出代价最小的二叉树,即最优的查询路径。每条路径的生成,包括单表的扫描,两表的连接,多表顺序连接,多表连接搜索空间等技术。
基于代价估算的查询优化就是通过计算和比较,找出花费最小的最优二叉树
运算符的角度考虑优化
不同的运算符根据其特点,可以对查询语句做不同的优化,优化可以减少中间生成物的大小和数量,节约IO,内存等,从而提高了执行速度。但优化的前提是:优化前和优化后语义必须等价。不同运算符的优化规则和可优化的原因如下

下推到集合的运算的转换实例:

运算规则角度考虑优化
查询重写规则
启发式规则在逻辑优化阶段的应用
总结
本篇文章从逻辑查询优化的基础关系代数开始,首先简略概述了关系代数的基础知识,重点在于描述关系代数的主要概念,分析关系代数的原理对于查询优化的指导意义,为查询优化技术做铺垫,通过PostgresSQL为示例,全面分析了查询优化可用的技术。




