您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 关系查询处理和查询优化
关系查询处理和查询优化内容要求掌握关系系统查询优化的相关概念了解查询优化的一般准则及步骤能够运用关系代数表达式的优化算法画出查询语法树以及优化后的语法树本讲内容一、关系数据库系统的查询处理二、关系数据库系统的查询优化三、代数优化四、物理优化一、关系数据库系统的查询处理什么是查询处理?从数据库中检索数据的活动。查询处理的任务把用户提交给RDBMS的查询语句转换为高效的执行计划。查询处理的目标将高级语言(例如SQL)表示的查询转换为正确有效的、用低级语言表达的执行策略,即实现关系代数,并通过执行该策略来获取所需的数据。一、关系数据库系统的查询处理1.查询处理步骤2.实现查询操作的算法示例1.查询处理步骤RDBMS查询处理过程:(1)查询分析(2)查询检查(3)查询优化(4)查询执行查询处理步骤(续)查询处理步骤(1)查询分析对查询语句进行扫描、词法分析和语法分析从查询语句中识别出语言符号进行语法检查和语法分析(2)查询检查根据数据字典对合法的查询语句进行语义检查根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查检查通过后把SQL查询语句转换成等价的关系代数表达式RDBMS一般都用查询树(语法分析树)来表示扩展的关系代数表达式把数据库对象的外部名称转换为内部表示(3)查询优化查询优化:选择一个高效执行的查询处理策略查询优化分类:代数优化:指关系代数表达式的优化物理优化:指存取路径和底层操作算法的选择查询优化方法选择的依据:基于规则(rulebased)基于代价(costbased)基于语义(semanticbased)(4)查询执行依据优化器得到的执行策略生成查询计划代码生成器(codegenerator)生成执行查询计划的代码示例例:用户U1针对学生课程数据库,完成如下查询:selectstudent.sno,cno,Gradefromstudent,scwherestudent.sno=sc.snoandsdept='CS‘与之等价的关系代数表达式?优化后的关系代数表达式?2.实现查询操作的算法示例(1)选择操作的实现(2)连接操作的实现示例1——选择操作的实现[例]Select*fromstudentwhere条件表达式;考虑条件表达式的几种情况:C1:无条件;C2:Sno='200215121';C3:Sage20;C4:Sdept='CS'ANDSage20;选择操作的实现(续)1)简单的全表扫描方法对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的元组作为结果输出适合小表,不适合大表2)索引(或散列)扫描方法适合选择条件中的属性上有索引(例如B+树索引或Hash索引)通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接在查询的基本表中找到元组选择操作的实现(续)[例1-C2]以C2为例,Sno=‘200215121’,并且Sno上有索引(或Sno是散列码)使用索引(或散列)得到Sno为‘200215121’元组的指针通过元组指针在student表中检索到该学生[例1-C3]以C3为例,Sage20,并且Sage上有B+树索引使用B+树索引找到Sage=20的索引项,以此为入口点在B+树的顺序集上得到Sage20的所有元组指针通过这些元组指针到student表中检索到所有年龄大于20的学生。选择操作的实现(续)[例1-C4]以C4为例,Sdept=‘CS’ANDSage20,如果Sdept和Sage上都有索引:算法一:分别用上面两种方法分别找到Sdept=‘CS’的一组元组指针和Sage20的另一组元组指针求这2组指针的交集到student表中检索得到计算机系年龄大于20的学生算法二:找到Sdept=‘CS’的一组元组指针,通过这些元组指针到student表中检索对得到的元组检查另一些选择条件(如Sage20)是否满足把满足条件的元组作为结果输出。(2)连接操作的实现连接操作是查询处理中最耗时的操作之一本节只讨论等值连接(或自然连接)最常用的实现算法[例2]SELECT*FROMStudent,SCWHEREStudent.Sno=SC.Sno;连接操作的实现(续)1)嵌套循环方法(nestedloop)2)排序-合并方法(sort-mergejoin或mergejoin)3)索引连接(indexjoin)方法4)HashJoin方法1)嵌套循环方法(nestedloop)对外层循环(Student)的每一个元组(s),检索内层循环(SC)中的每一个元组(sc)检查这两个元组在连接属性(sno)上是否相等如果满足连接条件,则串接后作为结果输出,直到外层循环表中的元组处理完为止SnoSnameSsexSageSdept200215121李勇男20CS200215122刘晨女19IS200215123王敏女18MA200215125张立男19IS学号课程号成绩SnoCnoGrade2002151211922002151212852002151213882002151222902002151223802)排序-合并方法适合连接的诸表已经排好序的情况排序-合并连接方法的步骤:如果连接的表没有排好序,先对Student表和SC表按连接属性Sno排序取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组2)排序-合并方法(续)200215121200215122200215123200215124...200215121192200215121285200215121388200215122290200215122380...排序-合并连接方法示意图2)排序-合并方法(续)排序-合并连接方法的步骤(续):当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来重复上述步骤直到Student表扫描完3)索引连接(indexjoin)方法步骤:①在SC表上建立属性Sno的索引,如果原来没有该索引。②对Student中每一个元组,由Sno值通过SC的索引查找相应的SC元组。③把这些SC元组和Student元组连接起来循环执行②③,直到Student表中的元组处理完为止。4)HashJoin方法把连接属性作为hash码,用同一个hash函数把R和S中的元组散列到同一个hash文件中。第一步,划分阶段。对包含较少元组的表(如R表)进行一遍处理,把它的元组按hash函数分散到hash表的桶中。第二步,试探阶段,也称连接阶段。对另一个表(S)进行一遍处理,把S的元组散列到适当的hash桶中,并把元组与桶中所有来自R并与之相匹配的元组连接起来。二、关系数据库系统的查询优化为什么提出来查询优化?这是由关系数据库系统的特点决定的,系统应该考虑采用什么样的查询才能做到执行起来既省时间,又省空间,而且效率也比较高。什么是查询优化?选择有效的执行策略执行查询的活动。查询优化的目标对于同一个高级查询有许多等价变换,RDBMS选择占用资源最小的一种。这就是查询优化的目标。二、关系数据库系统的查询优化1.查询优化的重要性2.查询优化的可能性3.查询优化的必要性1.查询优化的重要性关系系统的查询优化即是RDBMS实现的关键技术又是关系系统的优点所在。它减轻了用户选择存取路径的负担。用户只要提出“干什么”,不必指出“怎么干”。查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较好的效率,而且在于系统可以比用户程序的“优化”做得更好。思考:查询优化由谁来完成?2.查询优化的可能性(1)优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息(2)如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的。2.查询优化的可能性(3)优化器可以考虑数百种不同的执行计划,程序员一般只能考虑有限的几种可能性。(4)优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统的自动优化相当于使得所有人都拥有这些优化技术。查询时间开销RDBMS通过某种代价模型计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案集中式数据库执行开销主要包括:磁盘存取块数(I/O代价)处理机时间(CPU代价)查询的内存开销I/O代价是最主要的分布式数据库总代价=I/O代价+CPU代价+内存代价+通信代价查询优化的总目标选择有效的策略求得给定关系表达式的值使得查询代价最小(实际上是较小)示例——查询优化的必要性[例3]求选修了2号课程的学生姓名。用SQL表达:SELECTStudent.SnameFROMStudent,SCWHEREStudent.Sno=SC.SnoANDSC.Cno=‘2’;假定学生-课程数据库中有1000个学生记录,10000个选课记录其中选修2号课程的选课记录为50个查询优化的必要性(续)系统可以用多种等价的关系代数表达式来完成这一查询Q1=πSname(σStudent.Sno=SC.Sno∧Sc.Cno='2'(Student×SC))Q2=πSname(σSc.Cno='2'(StudentSC))Q3=πSname(StudentσSc.Cno='2'(SC))查询优化的必要性(续)(1)第一种情况Q1=πSname(σStudent.Sno=SC.Sno∧Sc.Cno=‘2’(Student×SC))1)计算广义笛卡尔积把Student和SC的每个元组连接起来的做法:在内存中尽可能多地装入某个表(如Student表)的若干块,留出一块存放另一个表(如SC表)的元组。把SC中的每个元组和Student中每个元组连接,连接后的元组装满一块后就写到中间文件上从SC中读入一块和内存中的Student元组连接,直到SC表处理完。再读入若干块Student元组,读入一块SC元组重复上述处理过程,直到把Student表处理完查询优化的必要性(续)设一个块能装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×104s101000510100010010000查询优化的必要性(续)2)作选择操作依次读入连接后的元组,按照选择条件选取满足要求的记录假定内存处理时间忽略。读取中间文件花费的时间(同写中间文件一样)需5×104s满足条件的元组假设仅50个,均可放在内存查询优化的必要性(续)3)作投影操作把第2步的结果在Sname上作投影输出,得到最终结果第一种情况下执行查询的总时间≈105+2×5×104≈105s所有内存处理时间均忽略不计查询优化的必要性(续)(2)第二种情况Q2=πSname(σSc.Cno='2'(StudentSC))1)计算自然连接执行自然连接,读取Student和SC表的策略不变,总的读取块数仍为2100块花费105s自然连接的结果比第一种情况大大减少,为104个写出这些元组时间为104/10/20=50s,为第一种情况的千分之一2)读取中间文件块,执行选择运算,花费时间也为50s。3)把第2步结果投影输出。第二种情况总的执行时间≈105+50+50≈205s查询优化的必要性(续)(3)第三种情况Q3=πSname(StudentσSc.Cno='2'(SC))1)先对SC表作选择运算,只需读一遍SC表,存取100块花费时间为5s,因为满足条件的元组仅50个,不必使用中间文件。2)读取S
本文标题:关系查询处理和查询优化
链接地址:https://www.777doc.com/doc-4712017 .html