在讲述这个优化器的时候,就必须先了解查询过程。在本系列的数据库四:浅谈数据库查询过程(Query Processing)中大致地说明了一下数据库的查询过程,但是没提到查询优化器的具体策略与实现。
对于查询而言,我们期望优化器的作用是找到最小代价的正确执行方案。但是这是一个NP完全问题,所以没有一个优化器能够真正地找到真正的最佳方案。
关于OLTP的查询优化会更加简单,一般来说选取最好的索引,JOIN操作也大多使用外键,用一些简单的策略就行。
比如,大家可以画一棵关系代数查询树,如果我们将选择操作尽可能下放到深处,则在进行笛卡尔乘或者JOIN的时候,参与运算的数据就少了。这就是heuristic optimazation。
所以在这儿我们将说明OLAP查询的优化策略。
单查询
多查询
静态优化
动态优化
混合优化
提示
固定优化器版本
向后兼容的计划
论文Query Processing In A Relational Database Management System
之前举了一个关系代数查询树的例子,说的就是Heuristics优化方法。它定义了一些规则,通过静态的方式来进行优化:
Oracle在早起非常受欢迎的原因就是因为它使用了这种方法。
优点:
缺点:
论文Access path selection in a relational database management system
使用静态规则执行初始优化,然后使用动态规划来确定表格的最佳连接顺序。
现在也非常常用的技术,MySQL、SQLite都用这个。
假设都没有索引,则得到数据的方式就是线性扫描。
然后将所有的JOIN操作的可能性都列出来,并找出最少代价的JOIN策略。其中也包括每个具体的JOI操作的算法。
因为有ORDER BY,所以要进行排序
优点:
缺点:
执行随机遍历查询的所有可能(有效)计划的解决方案空间。
继续搜索,直到达到代价阈值或优化器运行一段特定的时间。
例如:Postgres的遗传算法。
优点:
缺点:
用Heuristics方发生成的最初的查询计划,然后通过SQL运算符的随机排列(例如,交换两个表的连接顺序)来产生新的解。
更复杂的查询使用遗传算法来选择连接顺序的。
在每一轮开始时,生成查询计划的不同版本,选择成本最低的计划,并用其他计划进行排列。重复该操作。
首先使用转换规则重写逻辑查询计划。
然后执行基于成本的搜索,从而将逻辑查询计划映射到物理查询计划。
优点:
缺点:
用此方法实现更好地System R optimizer。
阶段1:查询重写
阶段2:计划优化
使用唯一的一个搜索空间,统一逻辑- 逻辑和逻辑- 物理转换的概念。 不需要单独的阶段,因为一切都是转换。
这种方法产生了更多的转换,因此大量使用memoization来减少冗余工作。
通用基于成本的查询优化器,基于关系代数上的等价规则。
不过这种方法似乎只在实验室或者学校中才有用到,工业界似乎没有用过这种方式。
优点
缺点:
自上而下的优化:从你想要的最终结果开始,然后在树上寻找最适合你的目标。
自下而上的优化:从一无所有开始,然后制定计划以达到您想要的最终结果。