
数据库系统概论:chp9 关系查询处理和查询优化.ppt
55页数据库系统概论数据库系统概论An Introduction to Database System第九章第九章 关系查询处理和查询优化关系查询处理和查询优化1第九章第九章 关系系统及其查询优化关系系统及其查询优化9.1 关系数据库系统的查询处理关系数据库系统的查询处理 9.2 关系数据库系统的查询优化关系数据库系统的查询优化 9.3 代数优化代数优化9.4 物理优化物理优化 9.5 小小 结结 2关系系统及其查询优化(续)关系系统及其查询优化(续)Ø本章目的:本章目的: lRDBMS的查询处理步骤 l查询优化的概念 l基本方法和技术 Ø查询优化分类 :l代数优化l物理优化39.1 关系数据库系统的查询处理关系数据库系统的查询处理Ø9.1.1 查询处理步骤查询处理步骤1. 查询分析2. 查询检查3. 查询优化 4. 查询执行Ø9.1.2 实现查询操作的算法示例实现查询操作的算法示例 4查询处理步骤查询处理步骤基于规则基于规则(rule based)基于代价基于代价(cost based)基于语义基于语义(semantic based)59.1 关系数据库系统的查询处理关系数据库系统的查询处理Ø9.1.1 查询处理步骤查询处理步骤1. 查询分析2. 查询检查3. 查询优化 4. 查询执行Ø9.1.2 实现查询操作的算法示例实现查询操作的算法示例 一、 选择操作的实现 二、 连接操作的实现 6一、一、 选择操作的实现选择操作的实现 [例1]Select * from student where <条件表达式> ;考虑<条件表达式>的几种情况: C1:无条件; C2:Sno='200215121'; C3:Sage>20; C4:Sdept='CS' AND Sage>20; 7选择操作的实现(续)选择操作的实现(续)Ø1. 简单的全表扫描方法简单的全表扫描方法 Ø对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的元组作为结果输出 Ø适合小表,不适合大表Ø2. 索引索引(或散列或散列)扫描方法扫描方法 Ø适合选择条件中的属性上有索引(例如B+树索引或Hash索引) Ø通过索引,先找到满足条件的元组主码或元组指针,再通过元组指针,直接在查询的基本表中找到元组 8选择操作的实现(续)选择操作的实现(续)Ø[例1-C2] Sno=‘200215121’,并且Sno上有索引(或Sno是散列码)l使用索引(或散列)得到Sno为‘200215121’ 元组的指针l通过元组指针在student表中检索到该学生Ø[例1-C3] Sage>20,并且Sage 上有B+树索引l使用B+树索引找到Sage=20的索引项,以此为入口点在B+树的顺序集上得到Sage>20的所有元组指针l通过这些元组指针到student表中检索到所有年龄大于20的学生。
9选择操作的实现(续)选择操作的实现(续)[例1-C4] Sdept=‘CS’ AND Sage>20,如果Sdept和Sage上都有索引:Ø算法一:分别用上面两种方法分别找到Sdept=‘CS’的一组元组指针和Sage>20的另一组元组指针Ø求这2组指针的交集Ø到student表中检索Ø得到计算机系年龄大于20的学生Ø算法二:找到Sdept=‘CS’的一组元组指针,Ø通过这些元组指针到student表中检索Ø对得到的元组检查另一些选择条件(如Sage>20)是否满足Ø把满足条件的元组作为结果输出 10二、二、 连接操作的实现连接操作的实现 Ø连接操作是查询处理中最耗时的操作之一 Ø本节只讨论等值连接(或自然连接)最常用的实现算法 [例2] SELECT * FROM Student,SC WHERE Student.Sno=SC.Sno; 11连接操作的实现连接操作的实现1. 嵌套循环方法(nested loop) l对外层循环(Student)的每一个元组(s),检索内层循环(SC)中的每一个元组(sc),在连接属性(sno)上是否相等2. 排序-合并方法(sort-merge join 或merge join)l取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组200215121200215122200215123200215124...200215121 1 92200215121 2 85200215121 3 88200215122 2 90200215122 3 80...排序-合并连接方法示意图12连接操作的实现连接操作的实现3. 索引连接(index join)方法 l对Student中每一个元组,由Sno值通过SC的索引查找相应的SC元组 l把这些SC元组和Student元组连接起来13连接操作的实现连接操作的实现4. Hash Join方法 把连接属性作为hash码,用同一个hash函数把R和S中的元组散列到同一个hash文件中步骤:步骤:Ø划分阶段(partitioning phase):l对包含较少元组的表(比如R)进行一遍处理l把它的元组按hash函数分散到hash表的桶中Ø试探阶段(probing phase):也称为连接阶段(join phase) l对另一个表(S)进行一遍处理l把S的元组散列到适当的hash桶中l把元组与桶中所有来自R并与之相匹配的元组连接起来 14第九章第九章 关系系统及其查询优化关系系统及其查询优化9.1 关系数据库系统的查询处理关系数据库系统的查询处理 9.2 关系数据库系统的查询优化关系数据库系统的查询优化 l关系系统的查询优化l非关系系统9.3 代代 数数 优优 化化 9.4 物物 理理 优优 化化 9.5 小小 结结 159.2 关系数据库系统的查询优化关系数据库系统的查询优化影响RDBMS性能的关键因素 由于关系表达式的语义级别很高,使关系系统可以从关系表达式中分析查询语义,提供了执行查询优化的可能性 Ø目标:l选择有效的策略l求得给定关系表达式的值l使得查询代价最小(实际上是较小) 16查询优化概述查询优化概述 Ø用户不必考虑如何最好地表达查询,Ø系统可以比用户程序的“优化”做得更好 (1) 优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息(2)如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。
在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的3)优化器可以考虑数百种不同的执行计划,程序员一般只能考虑有限的几种可能性4)优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握系统的自动优化相当于使得所有人都拥有这些优化技术17查询执行策略的执行代价查询执行策略的执行代价ØRDBMS通过某种代价模型,计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案l集中式数据库Ø执行开销主要包括:§磁盘存取块数(I/O代价)§处理机时间(CPU代价)§查询的内存开销 ØI/O代价是最主要的 l分布式数据库Ø总代价总代价=I/O代价代价+CPU代价代价+内存代价+通信代价内存代价+通信代价 189.2.2 一个实例一个实例[例3] 求选修了2号课程的学生姓名用SQL表达: SELECT Student.Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno=‘2’; 假定:学生-课程数据库中有1000个学生记录,10000个选课记录 其中选修2号课程的选课记录为50个 Ø可以用多种等价的关系代数表达式Q1=πSname(σStudent.Sno=SC.Sno∧Sc.Cno='2' (Student×SC))Q2=πSname(σSc.Cno='2' (Student SC))Q3=πSname(Student σSc.Cno='2'(SC))19一、第一种情况 Q1=πSname(σStudent.Sno=SC.Sno∧Sc.Cno='2' Student×SC))1. 计算广义笛卡尔积计算广义笛卡尔积 Ø把Student和SC的每个元组连接起来的做法:l在内存中尽可能多地装入某个表(如Student表)的若干块,留出一块存放另一个表(如SC表)的元组。
l把SC中的每个元组和Student中每个元组连接,连接后的元组装满一块后就写到中间文件上l从SC中读入一块和内存中的Student元组连接,直到SC表处理完l再读入若干块Student元组,读入一块SC元组l重复上述处理过程,直到把Student表处理完201. 计算广义笛卡尔积设一个块能装10个Student元组或100个SC元组,在内存中存放5块Student元组和1块SC元组,则读取总块数为 + =100+20×100=2100块其中,读Student表100块读SC表20遍,每遍100块若每秒读写20块,则总计要花105s 连接后的元组数为103×104=107设每块能装10个元组,则写出这些块要用106/20=5×104s 总代价总代价=I/O代价代价+CPU代价代价+内存代价+通信代价内存代价+通信代价212. 作选择操作作选择操作l依次读入连接后的元组,按照选择条件选取满足要求的记录 l假定内存处理时间忽略。
读取中间文件花费的时间(同写中间文件一样)需5×104s l满足条件的元组假设仅50个,均可放在内存 3. 作投影操作作投影操作把第2步的结果在Sname上作投影输出,得到最终结果 第一种情况下执行查询的总时间≈105+2×5×104≈105s所有内存处理时间均忽略不计Q1=πSname(σStudent.Sno=SC.Sno∧Sc.Cno='2' Student×SC))22二、 第二种情况 Q2=πSname(σSc.Cno='2' (Student SC))1. 计算自然连接 Ø执行自然连接,读取Student和SC表的策略不变,总的读取块数仍为2100块花费105 s Ø自然连接的结果比第一种情况大大减少,为104个 Ø写出这些元组时间为104/10/20=50s,为第一种情况的千分之一 2. 读取中间文件块,执行选择运算,花费时间也为50s3. 把第2步结果投影输出 第二种情况总的执行时间≈105+50+50≈205s 23三、 第三种情况1. 先对SC表作选择运算,只需读一遍SC表,存取100块花费时间为5s,因为满足条件的元组仅50个,不必使用中间文件。
2. 读取Student表,把读入的Student元组和内存中的SC元组作连接也只需读一遍Student表共100块,花费时间为5s3. 把连接结果投影输出 第三种情况总的执行时间≈5+5≈10s Q3=πSname(Student σSc.Cno='2'(SC))24三、 第三种情况Ø假如SC表的Cno字段上有索引l第一步就不必读取所有的SC元组而只需读取Cno=‘2’的那些元组(50个)l存取的索引块和SC中满足条件的数据块大约总共3~4块Ø若Student表在Sno上也有索引l第二步也不必读取所有的Student元组l因为满足条件的SC记录仅50个,涉及最多50个Student记录l读取Student表的块数也可大大减少 Ø总的存取时间将进一步减少到数秒 25三种情况的比较Ø把代数表达式Q1变换为Q2、 Q3,l即有选择和连接操作时,先做选择操作,这样参加连接的元组就可以大大减少,这是代数优化Ø在Q3中lSC表的选择操作算法,有全表扫描和索引扫描2种方法,经过初步估算,索引扫描方法较优 l对于Student和SC表的连接,利用Student表上的索引,采用index join代价也较小,这就是物理优化 26第九章第九章 关系系统及其查询优化关系系统及其查询优化9.1 关系数据库系统的查询处理关系数据库系统的查询处理 9.2 关系数据库系统的查询优化关系数据库系统的查询优化 9.3 代数优化代数优化 9.3.1 关系代数表达式等价变换规则关系代数表达式等价变换规则 9.3.2 查询树的启发式优化查询树的启发式优化9.4 物理优化物理优化 9.5 小小 结结 279.3.1 关系代数表达式等价变换规则关系代数表达式等价变换规则 Ø代数优化策略:通过对关系代数表达式的等价变换,来提高查询效率 Ø关系代数表达式的等价:指用相同的关系,代替两个表达式中相应的关系,所得到的结果是相同的Ø两个关系表达式E1和E2是等价的,可记为E1≡E2 28常用的关系代数等价变换规则常用的关系代数等价变换规则Ø1)连接、笛卡尔积的交换)连接、笛卡尔积的交换Ø2)连接、笛卡尔积的结合)连接、笛卡尔积的结合Ø3)投影的串接)投影的串接Ø4)选择的串接)选择的串接29Ø5)选择与投影的交换)选择与投影的交换Ø6)选择与笛卡尔积的交换)选择与笛卡尔积的交换Ø7)选择与并的交换)选择与并的交换Ø8)选择与差的交换)选择与差的交换常用的关系代数等价变换规则常用的关系代数等价变换规则(续续)30Ø9)投影与笛卡尔积的交换)投影与笛卡尔积的交换Ø10)投影与并的交换)投影与并的交换常用的关系代数等价变换规则常用的关系代数等价变换规则(续续)319.3 代数优化代数优化Ø9.3.1 关系代数表达式等价变换规则关系代数表达式等价变换规则 Ø9.3.2 查询树的启发式优化查询树的启发式优化 l选择运算应尽可能先做l投影运算和选择运算同时进行l投影同其前或其后的双目运算结合l把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算l找出公共子表达式329.3.2 查询树的启发式优化查询树的启发式优化 Ø典型的启发式规则:典型的启发式规则:1. 选择运算应尽可能先做。
在优化策略中这是最重要、最基本的一条2. 把投影运算和选择运算同时进行Ø如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系33查询树的启发式优化(续)查询树的启发式优化(续)3. 把投影同其前或其后的双目运算结合起来4. 把某些选择,同在它前面要执行的笛卡尔积结合起来成为一个连接运算5. 找出公共子表达式Ø如果这种重复出现的子表达式的结果不是很大的关系并且从外存中读入这个关系比计算该子表达式的时间少得多,则先计算一次公共子表达式并把结果写入中间文件是合算的Ø当查询的是视图时,定义视图的表达式就是公共子表达式的情况34优化关系表达式的算法优化关系表达式的算法遵循这些启发式规则,应用9.3.1的等价变换公式来优化关系表达式的算法算法:关系表达式的优化输入:一个关系表达式的查询树输出:优化的查询树方法:(1) 利用等价变换规则4把形如σF1∧F2∧…∧Fn(E)变换为σF1(σF2(…(σFn(E))…))2) 对每一个选择,利用等价变换规则4~9尽可能把它移到树的叶端35查询树的启发式优化(续)查询树的启发式优化(续)(3) 对每一个投影利用等价变换规则3,5,10,11中的一般形式,尽可能把它移向树的叶端。
l注意: Ø等价变换规则3使一些投影消失Ø规则5把一个投影分裂为两个,其中一个有可能被移向树的叶端 (4) 利用等价变换规则3~5,把选择和投影的串接合并成单个选择、单个投影或一个选择后跟一个投影使多个选择或投影能同时执行,或在一次扫描中全部完成 36查询树的启发式优化(续)查询树的启发式优化(续) (5) 把上述得到的语法树的内节点分组每一双目运算(×, ,∪,-)和它所有的直接祖先为一组(这些直接祖先是(σ,π运算)l如果其后代直到叶子全是单目运算,则也将它们并入该组l但当双目运算是笛卡尔积(×),而且后面不是与它组成等值连接的选择时,则不能把选择与这个双目运算组成同一组,把这些单目运算单独分为一组 37示例SELECT Student.Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno=‘2’; (1) 把SQL语句转换成查询树 查询树 关系代数语法树 38(2) 对查询树进行优化利用规则选择与笛卡尔积的交换律选择与笛卡尔积的交换律把选择σSC.Cno=‘2’移到叶端,Q1=πSname(σStudent.Sno=SC.Sno∧Sc.Cno='2' (Student×SC))Q3=πSname(Student σSc.Cno='2'(SC)) 优化后的查询树 39例:在教学数据库Student(Sno,Sname,Age,Sex)、SC(Sno,Cno,Grade)、Course(Cno,Cname,Teacher)中,查询语句:检索选修操作系统且成绩在90分以上的所有学生姓名。
1)画出关系代数表示的语法树 (2)画出优化后的语法树40第九章第九章 关系系统及其查询优化关系系统及其查询优化9.1 关系数据库系统的查询处理关系数据库系统的查询处理 9.2 关系数据库系统的查询优化关系数据库系统的查询优化 9.3 代数优化代数优化 9.4 物理优化物理优化 9.5 小小 结结 419.4 物理优化物理优化Ø选择高效合理的操作算法,或存取路径,求得优化的查询计划 Ø选择的方法:选择的方法: l基于规则的启发式优化l基于代价估算的优化l两者结合的优化方法Ø9.4.1 基于启发式规则的存取路径选择优化基于启发式规则的存取路径选择优化Ø9.4.2 基于代价的优化基于代价的优化42基于启发式规则的存取路径选择优化基于启发式规则的存取路径选择优化一、一、 选择操作的启发式规则选择操作的启发式规则:全表扫描全表扫描 VS 索引(有?使用?组合条件?)索引(有?使用?组合条件?)1. 对于小关系,使用全表顺序扫描,即使选择列上有索引 2.对于大关系,启发式规则有:对于大关系,启发式规则有:对于选择条件是主码=值的查询Ø查询结果最多是一个元组,可以选择主码索引主码索引Ø一般的RDBMS会自动建立主码索引。
43基于启发式规则的存取路径选择优化基于启发式规则的存取路径选择优化3. 对于选择条件是非主属性=值的查询,并且选择列上有索引4. 对于选择条件是属性上的非等值查询或者范围查询,并且选择列上有索引n要估算查询结果的元组数目Ø如果比例较小(<10%)可以使用索引扫描方法Ø否则还是使用全表顺序扫描 44基于启发式规则的存取路径选择优化基于启发式规则的存取路径选择优化5. 对于用AND连接的合取选择条件n如果有涉及这些属性的组合索引Ø优先采用组合索引扫描方法n如果某些属性上有一般的索引Ø则可以用[例1-C4]中介绍的索引扫描方法Ø否则使用全表顺序扫描6. 对于用OR连接的析取选择条件,一般使用全表顺序扫描45基于启发式规则的存取路径选择优化基于启发式规则的存取路径选择优化二、二、 连接操作的启发式规则:连接操作的启发式规则:1. 如果2个表都已经按照连接属性排序n 选用排序-合并方法2. 如果一个表在连接属性上有索引n 选用索引连接方法3. 如果上面2个规则都不适用,其中一个表较小n 选用Hash join方法 46基于启发式规则的存取路径选择优化基于启发式规则的存取路径选择优化4. 可以选用嵌套循环方法,并选择其中较小的表,即占用的块数(b)较少的表,作为外表(外循环的表) 。
理由:Ø设连接表R与S分别占用的块数为Br与BsØ连接操作使用的内存缓冲区块数为KØ分配K-1块给外表Ø如果R为外表,则嵌套循环法存取的块数为Br+( Br/K-1)BsØ显然应该选块数小的表作为外表 479.4.2 基于代价的优化基于代价的优化 Ø启发式规则优化是定性的选择,适合解释执行的系统l解释执行的系统,优化开销包含在查询总开销之中 Ø编译执行的系统中,查询优化和查询执行是分开的l可以采用精细复杂一些的基于代价的优化方法 一、 统计信息 二、 代价估算示例48基于代价的优化(续)基于代价的优化(续)一、一、 统计信息统计信息Ø基于代价的优化方法,要计算各种操作算法的执行代价,与数据库的状态密切相关 Ø数据字典中存储的优化器需要的统计信息: 1. 对每个基本表对每个基本表2. 对基表的每个列对基表的每个列3. 对索引对索引(如如B+树索引树索引)49一、 统计信息1. 对每个基本表对每个基本表l该表的元组总数(N)l元组长度(l)l占用的块数(B)l占用的溢出块数(BO) 2. 对基表的每个列对基表的每个列l该列不同值的个数(m)l选择率(f)l如果不同值的分布是均匀的,f=1/ml如果不同值的分布不均匀,则每个值的选择率=具有该值的元组数/Nl该列最大值l该列最小值l该列上是否已经建立了索引l索引类型(B+树索引、Hash索引、聚集索引)3. 对索引对索引(如如B+树索引树索引)l索引的层数(L)l不同索引值的个数l索引的选择基数S(有S个元组具有某个索引值)l索引的叶结点数(Y) 50二、 代价估算示例 1.全表扫描算法的代价估算公式全表扫描算法的代价估算公式l如果基本表大小为B块,全表扫描算法的代价 cost=Bl如果选择条件是码=值,那么平均搜索代价 cost=B/22. 索引扫描算法的代价估算公式索引扫描算法的代价估算公式l如果选择条件是码=值Ø如[例1-C2],则采用该表的主索引Ø若为B+树,层数为L,需要存取B+树中从根结点到叶结点L块,再加上基本表中该元组所在的那一块,所以cost=L+1l如果选择条件涉及非码属性Ø如[例1-C3],若为B+树索引,选择条件是相等比较,S是索引的选择基数(有S个元组满足条件)Ø最坏的情况下,满足条件的元组可能会保存在不同的块上,此时,cost=L+S 51 l如果比较条件是>,>=,<,<=操作Ø假设有一半的元组满足条件就要存取一半的叶结点Ø通过索引访问一半的表存储块cost=L+Y/2+B/2Ø如果可以获得更准确的选择基数,可以进一步修正Y/2与B/22. 索引扫描算法的代价估算公式(续)索引扫描算法的代价估算公式(续)52二、 代价估算示例3. 嵌套循环连接算法的代价估算公式嵌套循环连接算法的代价估算公式9.4.1中已经讨论过了嵌套循环连接算法的代价cost=Br+Bs/(K-1) Br Ø如果需要把连接结果写回磁盘, cost=Br+Bs/(K-1) Br +(Frs*Nr*Ns)/MrsØ其中Frs为连接选择性(join selectivity),表示连接结果元组数的比例ØMrs是存放连接结果的块因子,表示每块中可以存放的结果元组数目。
53二、 代价估算示例4. 排序排序-合并连接算法的代价估算公式合并连接算法的代价估算公式l如果连接表已经按照连接属性排好序,则cost=Br+Bs+(Frs*Nr*Ns)/Mrsl如果必须对文件排序Ø需要在代价函数中加上排序的代价Ø对于包含B个块的文件排序的代价大约是(2*B)+(2*B*log2B)549.5 小小 结结Ø查询处理是RDBMS的核心,查询优化技术是查询处理的关键技术 Ø优化方法 l启发式代数优化l基于规则的存取路径优化l基于代价的优化Ø比较复杂的查询,尤其是涉及连接和嵌套的查询l不要把优化的任务全部放在RDBMS上l应该找出RDBMS的优化规律,以写出适合RDBMS自动优化的SQL语句 Ø对于RDBMS不能优化的查询,需要重写查询语句,进行手工调整以优化性能55。






![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)





