Chapter09 - 关系查询处理和查询优化
ch58 查询处理
查询处理步骤
大部分情况下,应用的业务逻辑确定,那么相关的flower语句是确定的
执行重复的flower语句,可以直接使用查询执行计划。再次执行,就不需要优化了,直接使用
执行的次数越多,那么所带来的收益也就越大。
如果执行某些不常用的语句,
查询分析
查询检查
查询优化
基于规则的优化器更像是一个经验丰富熟知各条路段的老司机,大部分情况可以根据自己的经验来判断走哪条路可以更快的到达目的地,而基于代价的优化更像手机里面的地图,它可以选择出许多不同的路径根据实时的路况信息综合考虑路程长度,交通状况来挑出最优的路径。
查询执行
选择操作的实现
全表扫描算法
索引扫描算法
连接操作的实现
连接操作是查询处理中最耗时的操作之一
嵌套循环算法
排序-合并算法
- 排序阶段本身需要开销
- 排序的结果需要重新写回,无法存储在内存中
- 规模越大,收益越大
索引连接算法
Hash Join算法
ch59 查询优化
物理统计信息是归属在内模式中的
查询优化的实例
方案A
方案B
笛卡尔积上做特定选择就可以看做是连接
方案C
拥有索引的实例
优化实例
ch60 代数优化
先投影,后选择
同时进行选择(判断是否需要留下)和投影
类比:先发可乐,后发汉堡和同时发可乐、汉堡
典型的启发式规则
不需要找到每一个等价表达式,而是需要尽可能找到最优解
- 选择运算
- 应尽可能先做在优化策略中这是最重要、最基本的一条。
- 把投影运算和选择运算同时进行
- 如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系。
- 把投影同其前或其后的双目运算结合起来
- 没有必要为了去掉某些字段而扫描一遍关系。
- 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
- 连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间。
- 找出公共子表达式
- 如果这种重复出现的子表达式的结果不是很大的关系,并且从外存中读入这个关系比计算该子表达式的时间少得多,则先计算一次公共子表达式并把结果写入中间文件是合算的。
- 当查询的是视图时,定义视图的表达式就是公共子表达式的情况。视图产生的结果集是固定的?
大量的关系型数据库不支持笛卡尔积,效率低
启发式优化1
选择往叶节点跑
启发式优化2
启发式优化3
例子
ch61 物理优化
- 代数优化改变查询语句中操作的次序和组合,不涉及底层的存取路径
- 对于一个查询语句有许多存取方案,它们的执行效率不同, 仅仅进行代数优化是不够的
- 物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划
物理优化方法
- 基于规则的启发式优化
- 启发式规则是指那些在大多数情况下都适用,但不是在每种情况下都是最好的规则。
- 基于代价估算的优化
- 优化器估算不同执行策略的代价,并选出具有最小代价的执行计划。
- 两者结合的优化方法:
- 常常先使用启发式规则,选取若干较优的候选方案,减少代价估算的工作量
- 然后分别计算这些候选方案的执行代价,较快地选出最终的优化方案
启发式规则
选择操作的启发式规则
求并使用索引比较麻烦,得到的是超集
连接操作的启发式规则
基于代价的优化
统计信息
代价估算
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 丁丁的小窝(*^_^*)!