第九章 关系查询处理和查询优化
9.1 关系数据库系统的查询处理
9.1.1 查询处理步骤
-
查询分析
对查询语句进行扫描、词法分析和语法分析,
- 词法分析:从查询语句中识别出正确的语言符号。
- 语法分析:进行语法检查。
-
查询检查
- 合法性检查
- 视图转换
- 安全性和完整性初步检查
-
查询优化
查询优化即选择一个高效执行的查询处理策略。
- 代数优化/逻辑优化
- 指关系代数表达式的优化,即按照一定的规则,通过对关系代数表达式进行等价变换,改变代数表达式中操作的次序和组合,使查询执行更高效;
- 物理优化
- 指存取路径和底层操作算法的选择。
- 查询优化的选择依据
- 基于规则
- 基于代价
- 基于语义
- 代数优化/逻辑优化
- 查询执行
9.1.2 实现查询操作的算法示例
- 选择操作的典型实现
- 全表扫描方法(Table Scan)
- 对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的元组作为结果输出。该方法适合小表,不适合大表。
- 假设可以使用的内存为M块,全表扫描的算法思想如下:
- 按照物理次序读Student的M块到内存。
- 检查内存的每个元组t,如果t满足选择条件,则输出t。
- 如果Student 还有其他块未被处理,重复1和2。
- 索引扫描方法(Index Scan)
- 适合于选择条件中的属性上有索引(例如B+树索引或Hash索引),通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接在查询的基本表中找到元组。
- 全表扫描方法(Table Scan)
- 连接操作的实现
- 最耗时的操作
- 常用算法
- 嵌套循环算法(nestec 1oop join)
- 对外层循环(Student表)中的每一个元组(sc),检索内层循环(SC表)中的每一个元组(sc);
- 检查这两个元组在连接属性(Sno)上是否相等;
- 如果满足连接条件,则串接后作为结果输出,直到外层循环表中的元组处理完为止。
- 排序-合并算法(sort-merge join或merge join)
- 如果参与连接的表没有排好序,首先对Student表和SC表按连接属性Sno 排序。
- 取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组,把它们连接起来
- 当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来
- 索引连接(index join)算法
- 在SC表上已经建立了属性Sno的索引。
- 对Student中每一个元组,由Sno值通过SC的索引查找相应的SC元组。
- 把这些SC元组和Student元组连接起来。
- 循环执行②③,直到Student表中的元组处理完为止。
- Hash Join算法
- 嵌套循环算法(nestec 1oop join)
9.2 关系数据库系统的查询处理
9.2.1 查询优化概述
总代价 = I / O 代价 + C P U 代价 + 内存代价 + 通信代价 总代价 = I/O代价 + CPU代价+内存代价+通信代价 总代价=I/O代价+CPU代价+内存代价+通信代价
计算查询代价时一般用查询处理读写的块数作为衡量单位。
9.3 代数优化
9.3.1 关系代数表达式等价变换规则
代数优化策略是通过对关系代数表达式的等价变换来提高查询效率。
-
连接,笛卡儿积的交换律
- 设
E
1
E_1
E1和
E
2
E_2
E2是关系代数表达式,F是连接运算的条件
- E 1 × E 2 ≡ E 2 × E 1 E_1 \times E_2 \equiv E_2 \times E_1 E1×E2≡E2×E1
- E 1 ⋈ E 2 ≡ E 2 ⋈ E 1 E_1 \bowtie E_2 \equiv E_2 \bowtie E_1 E1⋈E2≡E2⋈E1
- E 1 ⋈ F E 2 ≡ E 2 ⋈ F E 1 E_1 \underset{F}{\bowtie} E_2 \equiv E_2 \underset{F}{\bowtie} E_1 E1F⋈E2≡E2F⋈E1
- 设
E
1
E_1
E1和
E
2
E_2
E2是关系代数表达式,F是连接运算的条件
-
连接,笛卡儿积的结合律
P281
9.3.2 查询树的启发式优化
典型的启发式规则
- 选择运算应尽可能先做。
- 在优化策略中这是最重要、最基本的一条。它常常可使执行代价节约几个数量级,因为选择运算一般使计算的中间结果大大变小。
- 把投影运算和选择运算同时进行。
- 如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有这些运算以避免重复扫描关系。
- 把投影同其前或后的双目运算结合起来,没有必要为了去掉某些字段而扫描一遍关系。
- 把某些选择同在它前面要执行的笛卡儿积结合起来成为一个连接运算,连接(特别是等值连接)运算要比同样关系上的笛卡儿积省很多时间。
- 找出公共子表达式。
- 如果这种重复出现的子表达式的结果不是很大的关系,并且从外存中读入这个关系比计算该子表达式的时间少得多,则先计算一次公共子表达式并把结果写入中间文件是合算的。当查询的是视图时,定义视图的表达式就是公共子表达式的
9.4 物理优化
物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划,达到查询优化的目标。选择的方法可以是:
- 基于规则的启发式优化。
- 启发式规则是指那些在大多数情况下都适用,但不是在每种情况下都是最好的规则。
- 基于代价估算的优化。
- 使用优化器估算不同执行策略的代价,并选出具有最小代价的执行计划。
- 两者结合的优化方法。
- 查询优化器通常会把这两种技术结合在一起使用。因为可能的执行策略很多,要穷尽所有的策略进行代价估算往往是不可行的,会造成查询优化本身付出的代价大于获得的益处。为此,常常先使用启发式规则,选取若干较优的候选方案,减少代价估算的工作量;然后分别计算这些候选方案的执行代价,较快地选出最终的优化方案。
9.4.1 基于启发式规则的存取路径选择优化
P284