1.关系数据库系统的查询处理
1.1查询处理步骤
关系数据库管理系统查询处理阶段 :
- 查询分析
- 查询检查
- 查询优化
- 查询执行
例题:SELECT Sname FROM Student WHERE Sno = “2018001;
step1:查询分析
对查询语句进行扫描、词法分析和语法分析,从查询语句中识别出正确的语言符号
词法分析:
- 保留字:SELECT、FROM 、WHERE
- 变量:Sname, Student, Sno
- 常量:“20180017”
- 运算符:=
可以发现拼写错误、命名错误、非法符号等
语法分析:按SQL语言的句法解释查询语句,进行语法检
例:SELECT Sname FROM Student WHEN Sno= “20180017”
step2:查询检查
有效性检查:
- 根据数据字典中有关的模式定义
- 检查语句中的数据库对象,如关系名、属性名是否存在和有效
视图转换
对视图的操作,要用视图消解方法把对视图的操作转换成对基本表的操作
安全性检查
完整性初步检查:
- 根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行 检查和对句子进行完整性检查
- 例如where Sno=20100017就是错误的,sno是Char(8)
检查通过后,把SQL查询语句转换成内部表示,即等价的关系代数表达式
关系数据库管理系统一般都用查询树来表示,也称为语法分析树
step3查询优化
- 查询优化是关系数据库成功的因素之一
- 优化技术的进步使得关系数据库走向产品
- 查询优化:选择一个高效执行的查询处理策略
- 查询优化分类
- 代数优化/逻辑优化:指关系代数表达式的优化
- 物理优化:指存取路径和底层操作算法的选择
- 查询优化的选择依据
- 基于规则(rule based)
- 基于代价(cost based)
- 基于语义(semantic based)
step4查询执行
- 依据查询优化器得到的执行策略生成查询执行计划
- 代码生成器(code generator)生成执行查询计划的代码
- 两种执行方法
- 自顶向下
- 自底向上
1.2实现查询操作的算法示例
1.2.1选择操作的实现
(1) 全表扫描方法 (Table Scan)
- 对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满 足条件的元组作为结果输出
- 适合小表,不适合大表
(2)索引扫描方法 (Index Scan)
- 需选择条件中的属性上有索引(例如B+树索引或Hash索引)
- 通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接 在查询的基本表中找到元组
1.2.2算法思想
1.2.2.1全表扫描
假设可以使用的内存为M块,Student表有N块,全表扫描思想:
① 按照物理次序读Student的M块到内存(M<N)
②检查内存的每个元组t,如果满足选择条件,则输出t
③ 如果student还有其它块未被处理,重复①和②
1.2.2.2索引扫描算法
SELECT * FROM Student WHERE Sdept='CS' AND Sage>20;
假设Sdept和Sage上都有索引 ➢
算法一:
- 分别用Index,Scan找到Sdept='CS'的一组元组指针和 Sage>20的另一组元组指针
- 求这两组指针的交集
- 由指针到Student表中检索,得到计算机系年龄大于20的学生
算法二:
- 找到Sdept='CS'的一组元组指针
- 通过这些元组指针到Student表中检索
- 并对得到的元组检查另一些选择条件(如Sage>20)是否满足
- 把满足条件的元组作为结果输出。
1.2.3总结
2.查询优化
关系数据库管理系统通过某种代价模型计算出各种查询执行策略 的执行代价,然后选取代价最小的执行方案
集中式数据库:
- 执行开销主要包括
- 磁盘存取块数(I/O代价)
- 处理机时间(CPU代价)
- 查询的内存开销
分布式数据库
总代价=I/O代价+CPU代价+内存代价+通信代价
2.1关系代数表达式等价变换规则
2.1.1连接、笛卡尔积交换律
2.1.2连接、笛卡尔积的结合律
2.1.3投影的串接定律
2.1.4选择的串接定律
2.1.5选择与投影操作的交换律
2.1.6选择与笛卡尔积的交换律
2.1.7选择与并的分配律
2.1.8选择与差运算的分配律
2.1.9选择对自然连接的分配律
2.2典型的启发式规则
选择运算应尽可能先做:计算的中间结果大大变小。
把投影运算和选择运算同时进行:避免重复扫描关系
把投影同其前或其后的双目运算结合起来:减少扫描关系的次数
把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算, 连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间
找出公共子表达式
- 如果这种重复出现的子表达式的结果不是很大的关系
- 并且从外存中读入这个关系比计算该子表达式的时间少得多
- 则先计算一次公共子表达式并把结果写入中间文件是合算的
- 当查询的是视图时,定义视图的表达式就是公共子表达式的情