1、第6章 查询处理和优化,6.1 引言,查询处理,查询优化,查询优化是查询处理中的重要一环,对关系DB尤其如此。, 从查询语句出发,到获得查询结果的处理过程。, DBMS对描述性语言表达的查询语句进行分析,为其确定合理、有效的执行策略和步骤的过程。,例如:12+64+88=?,查询优化是相对而言的,可能的执行策略很多,穷尽代价很大,不能片面追求绝对的最优。,(12+88)+64=164,数据库查询语言的处理过程:,(1)解释方式执行,优化占执行时间!,查询语句,(2)编译方式,CALL AM(参数),优化不占执行时间!,对于常见的例行事务,编译方式可提高性能。,对于简短的即时查询,解释方式灵活实
2、用。,解释方式和编译方式各适用于什么情况?,代数优化 对查询语句进行变换不涉及存取路径物理优化 根据存取路径选择合理的存取策略进行优化规则优化 仅根据启发式规则选择执行的策略进行优化代价估算优化,6.2 代数优化,代数优化对查询进行等效变换,以减少执行开销。,代数优化的原则是尽量减小查询过程中间结果的大小。,选择、投影操作通常能够有效地减小关系的大小。连接、迪卡尔乘积和并操作容易生成较大的查询中间结果。,因此,先做选择、投影;先做小关系间的连接,再做大关系的连接;甚至需要先找出查询中的公共表达式,以避免重复运算。,常用变换规则,1.,2.,3.,4.,6.,7.,8.,9.,10.,注意:规则
3、11中,对于连接运算,可能出现S与T之间无连接条件的情况,此时的连接运算成为迪卡尔乘积。,11.,范例p118例6-1,设有S(供应商),P(零件),SP(供应关系)三个关系,关系模式如下: S(SNUM,SNAME,CITY) P(PNUM,PNAME,WEIGHT,SIZE) SP(SNUM,PNUM,DEPT,QUAN),有如下查询Q : SELECT SNAME FROM S,P,SP WHERE S.SNUM = SP.SNUM AND SP.PNUM = P.PNUM AND S.CITY = NANJING AND P.PNAME = BOLT AND SP.QUAN 10000
4、,SQL语句转化为原始查询树 Select From Where,Q可用右图所示的原始查询树表示:,Q : SELECT SNAME FROM S,P,SP WHERE S.SNUM = SP.SNUM AND SP.PNUM = P.PNUM AND S.CITY = NANJING AND P.PNAME = BOLT AND SP.QUAN 10000,选择操作下压,选择操作尽量下压,原始查询树,先连接小关系,S,P,SP经选择后得S、P、SP,估算大小: |S|=|S|/NCITY |P|=|P|/NPNAME |SP|=|SP|(Vmax-10000)/(Vmax-Vmin),设|S
5、|P|, |SP|,S(j)B then jj+1 else if R(i)AS(j)B then ii+1 else /* R(i)A=S(j)B,输出连接元组*/,输出至T;/*输出R(i)和S中除S(j)外的其他元组所组成的连接元组 */lj+1;While(lm) and (R(i)A=S(l)B) do输出至T; ll+1;/*输出S(j)和R中除R(i)外的其他元组所组成的连接元组 */ki+1;While(kn) and (R(k)A=S(j)B) do输出至T; kk+1;ii+1,jj+1;,注意等值的扫描次数(假设pq):,1+(q-1)+(p-1)+1+(q-2)+(p-
6、2)+ +1+(q-p)+(p-p)=(p+q-1)+(p+q-2q+1)/2*p=p*q O(pq),4).散列连接法,连接属性R.A和S.B应具有相同的值域,用相同的散列函数,把R和S散列到同一散列文件中。符合连接条件的元组必然在同一通中(注意:同一桶中的元组未必都满足连接条件)。只需把桶中的匹配元组取出即可获得连接结果。,关键在于建立一个供连接用的散列文件。,可以在桶(散列文件)中不填入R、S的实际元组,而是代之以元组的tid,从而大大的缩小散列文件,使其有可能在内存中建立,而仅需对R、S各扫描一次。,建立散列文件需要对R、S各扫描一次,且关系R和S一般不会对连接属性进行簇集。故而,每向
7、散列文件加入一个元组,都需要一次I/O操作。,如何减少I/O次数?,扫描R和S时,取出A(R)、B(S),附在相应的tid后,连接时以桶为单位,按A(R)=B(S)找出匹配元组的tid对。,问题:似乎多此一举!匹配元组的tid一定在同一桶中!为什么还要按A(R)=B(S)找出匹配元组?这么做有必要么?,注意:A=B h(A)=h(B),但不一定有: h(A)=h(B) A=B,在取实际元组时,为减少物理块访问,可将各桶中,匹配元组的tid按块分类,一次集中取出同一块中所需的所有元组,当然这需要较大的内存开销。,连接方法的启发式规则,1)两个关系都已按连接属性排序,则优先用排序归并法;两个关系中
8、已有一个关系按连接属性排序,另一个关系较小,也可先对未排序关系按连接属性排序,再用排序归并法。2)两个关系中有一个关系在连接属性上有索引(特别是簇集索引)或散列,可以另一关系为外关系,顺序扫描,并利用内关系上的索引或散列寻找其匹配元组,以代替多遍扫描。3)不具备上述条件且关系较小,可用嵌套循环法。4)不具备1,2,3规则,可用散列连接法。,6.3.3 投影操作的实现,一般与选择、连接同时进行,无需附加的I/O开销。,若投影属性集中不包含主键,则投影结果中可能出现重复元组。,消除重复元组可以用排序或散列等方法。,散列法:将投影结果按某一属性或多个属性散列成一个文件,当一个元组被散列到一个桶中时,
9、可检查是否与桶中已有元组重复。,用排序法消除重复元组,对关系R的每个元组t,生成t,并存于T中;/* T 是未消除重复元组的投影结果*/If 含有R的主键 then TT elseT按所有属性排序; i1,j2; while(in) do输出元组T(i)到T;,while T(i)= T(j) do jj+1;/*消除重复元组,设有伪元组Tn+1Tn*/ij,ji+1; ,6.3.4 集合操作,常用集合操作:笛卡尔乘积、并、交、差等。,设关系R、S并兼容,对R、S进行并(交、差)操作,可以先将R和S按同一属性(通常选用主键)排序,然后扫描两个关系,选出所需的元组。,笛卡尔乘积将两个关系的元组无
10、条件地互相拼接,一般用嵌套循环法实现,做起来很费时,结果要比参与运算的关系大的多。应尽量少用!,散列是上述并交差操作的另一种求解方法: 将关系R散列到一个散列文件中,再将S散列到同一文件中。同时检查桶中有无重复元组。对于并,不再插入重复元组;对于交,选取重复元组;对于差,从桶中取消与S重复的元组。,6.3.5 组合操作,有时,多个操作组合起来同时进行,如投影和选择操作组合起来执行(消除重复元组另外单独进行),可提高效益。 还可以在更大范围内,将多个操作组合起来执行。,假设连接用嵌套循环法,R为外关系,S为内关系,R的选择、投影可在扫描R时执行,S的选择、投影可在首次扫描S时执行,并将选择、投影的结果存入临时文件,之后各轮只需扫描临时文件即可。,最后一个投影操作,可在生成连接结果的同时进行。,6.5 结束语,在执行前进行优化称为静态优化,只能利用统计数据,有时不一定准。,在查询执行时进行优化称为动态优化,用实际执行结果估算代价,比较符合实际,但每次执行都要优化,不适于编译实现,也增加了执行时间。只能利用统计数据,有时不一定准。另外,优化时,要等待中间结果,增加了等待时间和数据的相关性,不利于并行性。,