1.关系查询处理
为什么要有查询处理这个步骤?
其目的是把我们的查询语句转化为高效的执行计划。
其有四个阶段:
查询分析:分析语句是否有问题
查询检查:分析语义是否有问题
查询优化:主要有物理优化和代数优化,挺高效率的关键
查询执行:顾名思义
下面介绍一些实现查询操作的算法思想,再着重介绍查询优化,特别是代数优化。
1.1连接操作的实现。
扫描全表法: 逐一检查每个元组是否满是选择条件
索引扫描法: 若选择条件中有索引,先通过索引找到符合条件元组指针,再通过元组指针检索到结果。
一般来说前一种方法大表效率低,后者效率高。
1.2连接操作的实现
以两表为列,可以拓展到多表
嵌套循环法: 对外层循环每一个元组,检查内层循环每一个元组是否符合连接条件
排序—合并法: 对两表连接属性排序和,有点类似于两个链表的连接合并过程进行查找并连接
索引连接法: 对一表连接属性创建索引,对另一表的每个连接属性通过索引查找是否符合连接条件并连接。
Hash Join 方法: 用连接属性做哈希码,用同一个哈希函数散列后连接。
2.查询优化
查询优化分物理优化和代数优化,这里主要介绍代数优化,物理优化不谈。
代数优化是利用关系代数等价变换规则的优化方法,首先得明确自己的优化方向:
一般来说差、并、笛卡尔积、连接是二目运算,比较复杂,投影、选择较简单。所以:
a.选择运算先行,投影先行
b.选择投影串联一般要合并成单个选择或单个投影或一个选择后跟一个投影
明白上面两个大方向后,其实自己要记忆的式子就少了许多,大方向就是转为投影或者转为选择。
由于符号问题转换成中文描述:
转为投影:
投影的串接定理:应用一般,可以自主思考
投影与笛卡尔积的分配率:以A、B分别代表E1,E2的属性列:
投影A,B(E1XE2)=投影A(E1)X投影B(E2) //**重点**
投影与并的分配率:先并再投=先投再并 //**重点**
转为选择:
选择与笛卡尔积的交换律:若F为E1中的属性,则: 选择F(E1XE2)=选择F(E1)XE2 若F=F1和F2 且F1只属于E1,F2只属于E2,则: 选择F(E1XE2)=选择F1(E1)X选择F2(E2) 若F=F1和F2 且F1只属于E1,F2属于E1、E2,则: 选择F(E1XE2)=选择F2(选择F1(E1)XE2)//重点 选择串接定理:选择F1(选择F2(E))=选择F2(选择F1(E))=选择F1和F2(E)//重点 选择的分配率:先(并、差、连接)再选择=分别选择再(并、差、连接//重点