教材:数据库系统概论(第五版) 王珊著
网课链接:CH09 关系查询处理和查询优化
文章目录
9.1 关系数据库系统的查询处理
- 代数优化
- 利用等价交换规则,交换律结合律等
- 物理优化
9.1.1 查询处理步骤


-
查询优化分类
-
代数优化
- 根据代数规则改变关系代数表达式的计算次序和组合,获得更好的查询效率
-
物理优化
- 改变存取路径,底层的
-
-
选择依据
- 基于规则
- 基于定性的规则方针规则
- 基于代价
- 定量的
- 基于规则

9.1.2 查询操作算法示例
-
查询算法很多:
-
选择、投影、笛卡尔积、连接
-
以选择和连接为例简单描述算法思想
选择操作的实现

- 选择操作典型实现方法

-
全表扫描
- 元组成批次读入内存块,一个一个元组扫过去看是否满足条件,读完一批换下一批。
- 只需要很少的内存
- 对太大的表,而复合条件的元组少的情况下,效率较低
-
索引
- 内容多,选择率低的情况适合
-
示例 课本P277

连接操作的实现
连接操作是查询处理中最常用也是最耗时的操作之一

-
嵌套循环方法

- 将占用内存块数比较小的表作为嵌套循环的外表,以减小代价
-
排序-合并算法

- 适用于已经在连接属性上排好序的情形
- 这种情况下两个表只要扫描一遍
- 当然也可以先排序再用这个算法,但要考虑排序本身的开销
-
索引连接算法

- 适用于连接的两表至少有一个在连接上有索引
- 如果两表均在连接属性上有索引,则相当于排序-合并连接
- 只有一个列的连接属性上有索引,扫描一遍另一个表:
- Student表的sno列是主码,一定有索引。假设SC上的sno没有索引
- 则要扫描一遍SC表,对其sno值通过Student表的索引找到对应的元组,进行连接
-
哈希连接算法

- hash表的创建
- 选择较小的表作为驱动表,以连接属性的值作为哈希码
- 让元组通过哈希函数散列到桶中
- 探测(连接阶段)
- 另一个表的元组按同一个哈希函数,以连接属性的值作为哈希码,找到适当的哈希桶,与桶中连接相匹配的元组匹配起来
- hash表的创建

-
如果两表均已在连接属性上排序,首选合并连接
-
如果至少一表在连接属性上有索引,次选索引连接
-
若上面两个连接方法均不适用,但其中有一个表较小,则可采用哈希连接
-
上述方法均不适用,最后采用嵌套循环连接,一定要用内存比较小的表做外表
9.2 关系数据库系统的查询优化
9.2.1 查询优化概述
关系查询优化是影响关系数据库管理系统性能的关键因素
查询优化的优点不仅在于用户不必考虑如何最好的表达查询以获得较高的效率,而且在于系统可以比用户程序的“优化”做得更好。
-
关系数据库系统采用代价模型来计算各种查询代价,选取代价最小的方案
-
查询优化的代价模型

- 由于磁盘I/O操作花费时间相比大几个数量级,因此,在计算查询代价时一般用查询处理读写的块数作为衡量单位。
-
查询优化的总目标
- 选择有效的策略
- 求得给定关系表达式的值
- 使得查询代价最小(实际上是较小)
9.2.2 一个示例
一个示例,说明为什么要优化(非常滴重要,要会算)
- 题目

-
系统可以用多种等价的关系代数表达式来完成这一查询,但分析下面三种情况就够了

-
系统假设

- 说明:
- 块大小中SC表的列数比较小,所以同一块可以装更多的SC元组
- 为什么内存块分配五块给Student表呢,因为我们选择潜逃算法,必须把占用内存块少的表作为外表
- Student:1000/10 = 100个内存块
- SC:10000/50 = 200个内存块
- 所以Student表作为外表,每次装入一部分,比较完后装入另外一部分。没换一遍数据,内表都要重新装入一遍。所以为了减少内表循环装入的遍数(减少外层循环次数),尽可能多的分配内存给外表。
- 一块给内表,一块给中间结果,其余的给外表是必然结果
- 说明:
查询方案1

-
计算笛卡尔积
- 根据系统假设

- 根据系统假设
-
作选择操作
- 选择后的结果就50个元组,均可放入内存,不需要读写磁盘

- 选择后的结果就50个元组,均可放入内存,不需要读写磁盘
-
作投影操作
- 总数

- 总数
查询方案2

- 先做一次自然连接,再做一次行选择,再做一次投影
- 自然连接结果10000行,因为有参照完整性约束,一万行写入中间结果

查询方案3


查询方案4
实践中更高效的方案

- 结论

9.3 代数优化
9.3.1 关系代数的等价交换规则
代数优化策略是通过对关系代数表达式的等价交换来提高查询效率
(不要求具体掌握,了解即可)









- 小结
- 交换通常都是有前提条件的

- 交换通常都是有前提条件的
9.3.2 查询树的启发式优化
(要求掌握,画语法树)
- 代数优化的启发式规则:
-
选择运算应尽可能先做!!(减小中间集的规模)
-
投影和选择运算同时进行(避免重复扫描)
-
将投影运算和其前后的双目运算符结合起来(避免重复扫描)
-
某些选择运算+其前面的笛卡尔积->连接运算(减小中间集规模)

-
提取公共子表达式(公因子)(保存计算结果,避免重复计算)
-
遵循这些启发式规则,应用9.3.1等价变化公式来优化关系表达式

- 第一步
- 分解不同选择条件,使其沿不同分支向树叶移动,直到移动到这个选择条件相关的关系树,使选择尽可能先做
- 第三步
- 尽早丢弃既不是投影的目标属性,又不是连接属性的多余属性

- 第一步

-
例子1
-
第一步

-
首先做一次笛卡尔积,然后做一次选择,再做一次选择,最后做一次投影
-
第二步

-
- 选择运算尽可能下移, 这里选择课程编号为2,沿对应分支移到下方
- 还有一个选择条件涉及两表,不能往下移动
-
第三步

-
例子2

-
第一步

-
第二步

-
第三步

-
第四步

- Sname与左边的子树无关,不跟着下移
- 左边S#穿过自然连接,由于自然连接的属性是C#,所以投影属性自动加上C#(投影运算下移自动保留链接属性)
-
第五步

- 左边SC的投影可以去掉,因为一个投影而扫描SC没有必要,可以在运算的同时顺带投影
9.4 物理优化

- 选择的方法
- 基于规则的启发式优化
- 基于代价估算的优化
- 两者结合的优化方法
9.4.1 基于启发式规则的优化
- 选择操作的启发式规则


- 连接操作的启发式规则


9.4.2 基于代价估算的优化
基于启发式规则的优化是一种定性的优化策略,优点是简单,缺点是粗糙,不够精细。
而基于代价估算的优化是一种定量的、更加精细、复杂的优化方案
-
统计信息



-
代价估算示例
(不要求掌握)
- 全表扫描算法的代价估算公式
- 索引扫描的代价估算公式
- 嵌套循环连接的代价估算公式
- 排序-合并连接算法的代价估算公式
总结

数据库查询处理与优化详解
本文详细介绍了数据库查询处理的步骤,包括选择、连接等操作的算法实现,并重点讨论了查询优化,包括代数优化和物理优化策略。强调了查询优化在提升系统性能中的关键作用,以及如何通过代价模型选择最优查询方案。此外,还探讨了不同查询方案的代价估算和实际应用中的优化方法。
870

被折叠的 条评论
为什么被折叠?



