虽然写这个博客主要目的是为了给我自己做一个思路记忆录,但是如果你恰好点了进来,那么先对你说一声欢迎。我并不是什么大触,只是一个菜菜的学生,如果您发现了什么错误或者您对于某些地方有更好的意见,非常欢迎您的斧正!
目录
9.1关系数据库系统的查询处理
√查询处理是关系数据库管理系统执行查询语句的过程,其任务是把用户提交给数据库管理系统的查询语句转换为高效的查询执行计划。
9.1.1查询处理步骤
√查询分析→查询检查→查询优化→查询执行。
9.1.2实现查询操作的算法示例
9.2关系数据库系统的查询优化
9.2.1查询优化概述
√RDBMS通过某种代价模型计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案
√集中式数据库
√执行开销主要包括: 磁盘存取块数(I/O代价)
处理机时间(CPU代价)
查询的内存开销
√I/O代价是最主要的,因此在计算查询代价时,一般用查询处理的块数作为衡量单位。
√分布式数据库:总代价=I/O代价+CPU代价+内存代价+通信代价
√查询优化的总目标:
·选择有效的策略
·求得给定关系表达式的值
·使得查询代价最小(实际上是较小)
9.2.2一个实例
√例9.3:求选修了2号课程的学生姓名。用SQL表达:
SELECT Student.Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND SC.Cno=‘2’
假定学生-课程数据库中有1000个学生记录,10000个选课记录其中选修 2 号课程的选课记录为50个
设一个块能装10个Student元组或100个SC元组
√Q1
①读Student表:1000÷10=100
读SC表:10000÷100=100
∴读表:100+100
②笛卡尔积连接后元组数有,每块能装10个元组,则写出块。
③读连接后的表:块。
√Q2
①读Student表:1000÷10=100
读SC表:10000÷100=100
∴读表:100+100
②等值连接后的表有10000个记录,所以写与读都是10000÷10=1000
√Q3
①对SC表做选择操作,只读一次SC表,存取块数为10000÷100=100,满足条件的只有50个,所以不必使用中间文件。
②读Student表,只读1000÷10=100块,等值连接后作投影输出
③∴读100+100
9.3代数优化
9.3.1关系代数表达式等价变换规则
√代数优化策略是通过对关系代数表达式的等价变换来提高查询效率。
√两个关系表达式 E1 和 E2 是等价的,记为E1 ≡E2
规则①:连接、笛卡尔积的交换律
和是关系代数表达式,F是连接运算的条件。
规则②:连接、笛卡尔积的结合律
规则③:投影的串接定律
规则④:选择的串接定律
规则⑤:选择与投影操作的交换律
规则⑥:选择与笛卡尔积的交换律
规则⑦:选择与并的分配律
规则⑧:选择与差运算的分配率
规则⑨:选择对自然连接的分配率
规则⑩:选择与笛卡尔积的分配率
规则⑪:投影与并的分配率
9.3.2查询树的启发式优化
√典型的启发规则:
①选择运算应尽可能先做
·在优化策略中这是最重要、最 基本的一条
②把投影运算和选择运算同时进行
·如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系
③把投影同其前或其后的双目运算结合起来
·没有必要为了去掉 某些字段而扫描一遍关系表
④把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
·连接运算特别是等值连接要比同样关系上的笛卡尔积省很多时间
⑤找出公共子表达式
·如果这种重复出现的子表达式的结果不是很大的关系,并且从外存中读入这个关系比计算该子表达式的时间少得多,则先计算一次公共子表达式并把结果写入中间文件是合算的
·当查询的是视图时,定义视图的表达式就是公共子表达式的情况
√遵循这些启发式规则,应用等价变换公式来优化关系表达式的算法
【算法】关系表达式的优化
【输入】一个关系表达式的查询树
【输出】优化的查询树
【方法】
1)利用等价变换规则4把形如变换为
2)对每一个选择,利用等价变换规则4-9尽可能把它移到树的叶端。
3)对每一个投影利用等价变换规则3,5,10,11中的一般形式尽可能把它移向树的叶端。
【注意】
等价变换规则3使一些投影消失
规则5把一个投影分裂为两个,其中一个有可能被移向树的叶端
4)利用等价变换规则3-5 把选择和投影的串接合并成单个选择、单个投影或一个选择后跟一个投影。使多个选择或投影能同时执行,或在一次扫描中全部完成
例9.4:下面给出例9.3中SQL语句的代数优化示例:
①SQL语句 → 查询树
②对查询树进行优化
9.4物理优化
√物理优化:选择高效合理的操作算法或存取路径,求得优化的查询计划,达到查询优化的目标。
√选择的方法可以是:
①基于规则的启发式优化。
②基于代价估算的优化
③两者结合的优化方法
9.4.1基于启发式规则的存取路径选择优化
①选择操作的启发式规则
√对于小关系,使用全表顺序扫描,即使选择列上有索引
√对于大关系,启发式规则有:
1)对于选择条件是 "主码=值" 的查询
·查询结果最多是一个元组,可以选择主码索引
·一般的DBMS会自动建立主码索引。
2)对于选择条件是 “非主属性=值” 的查询,并且选择列上有索引
·估算查询结果的元组数目
如果比例较小(<10%)可以使用索引扫描方法
否则使用全表顺序扫描
3)对于选择条件是属性上的非等值查询或者范围查询,并且选择列上有索引
·估算查询结果的元组数目
如果比例较小(<10%)可以使用索引扫描方法
否则还是使用全表顺序扫描
4)对于用AND连接的合取选择条件
·涉及这些属性的组合索引→优先采用组合索引扫描方法
·某些属性上有一般的索引→用[例1- C4]中介绍的索引扫描方法
·否则使用全表顺序扫描
5)用OR连接的析取选择条件→全表顺序扫描
②连接操作的启发式规则
√两个表都已经按照连接属性排序→排序-合并方法
√一个表在连接属性上有索引→索引连接方法
√上面两个规则都不适用,其中一个表较小→Hash join方法
√选用嵌套循环方法,并选择其中较小的表,确切地讲是占用的块数(b)较少的表,作为外表(外循环的表)
【理由】
设连接表R与S分别占用的块数为Br与Bs
连接操作使用的内存缓冲区块数为K
分配K-1块给外表
如果R为外表,则嵌套循环法存取的块数为Br+( Br/K-1)Bs
显然应该选块数小的表作为外表
9.4.2基于代价估算的优化
√启发式规则优化是定性的选择,适合解释执行的系统,优化开销包含在查询总开销之中。
√编译执行的系统中查询优化和查询执行是分开的可以采用精细复杂一些的基于代价的优化方法
①统计信息
√基于代价的优化方法要计算各种操作算法的执行代价,与数据库的状态密切相关,数据字典中存储了的优化器需要的统计信息(database statistics)。