分享

4-3-2

 昵称233866 2009-11-07


4.3.2 关系代数表达式的启发式优化算法

1.引言
(1)现在,许多系统都是采用启发式优化(heuristic optimization)方法对关系代数表达式进行优化。
(2)这种优化策略与关系的存储技术无关,主要是讨论如何合理安排操作的顺序,以花费较少的空间和时间。
(3)在关系代数表达式中,最花费时间和空间的运算是笛卡儿积和连接操作。

2.三条启发式规则
(1)尽可能早地执行选择操作;
(2)尽可能早地执行投影操作;
(3)避免直接做笛卡儿积,把笛卡儿积操作之前和之后的一连串选择和投影合并起来一起做。

3.说明
(1)通常选择操作优先于投影操作比较好,因为选择操作可能会大大减少关系,并且选择操作可以利用索引存取元组。
(2)关系代数表达式的启发式优化是由DBMS的DML编译器完成的。对一个关系代数表达式进行语法分析,可以得到一棵语法树,树中叶子是关系,非叶子结点是关系代数操作。利用启发式规则可以对关系代数表达式进行优化。

4.关系代数表达式的启发式优化算法
(1)输入:一个关系代数表达式的语法树
(2)输出:计算表达式的一个优化序列
(3)方法:依次执行下面每一步。
   ①把每个形为σF1∧…∧Fn(E)的子表达式转换成选择级联形式:σF1(…(σFn(E))…)
   ②在语法树中,尽可能把每个选择操作下推到最早可能执行的地方(即移向树的叶端)。
   例如,只要有可能,σF(R×S)转换成σF(R)×S或R×σF(S)。尽早执行基于值的选择运算可以减少对中间结果进行排序的代价。
   ③对每个投影操作,尽可能把投影操作往下推,移向树的叶端。可能使某些投影操作消失,也可能把一个投影分成两个投影操作,其中一个将靠近叶端。如果一个投影是针对被投影的表达式的全部属性,则可消去该投影操作。
   ④把选择和投影合并成单个选择、单个投影或一个选择后跟一个投影。使多个选择、投影能同时执行或在一次扫描中同时完成。
   ⑤将上述步骤得到的语法树的内结点分组。
   每个二元运算(×、∪、-)结点与其直接祖先(不超过别的二元运算结点)的一元运算结点(σ或Π)分为一组。如果它的子孙结点一直到叶都是一元运算符(σ或Π),则也并入该组。但是,如果二元运算是笛卡儿积,而且后面不是与它组合成等值连接的选择时,则不能将选择与这个二元运算组成同一组。
   ⑥生成一个序列,每一组结点的计算是序列中的一步,各步的顺序是任意的,只要保证任何一组不会在它的子孙组之前计算。

5.实例
(1)对于教学数据库中的关系
  教师关系:T(T#,TNAME,TITLE)
  课程关系:C(C#,CNAME,T#)
  学生关系:S(S#,SNAME,AGE,SEX)
  选课关系:SC(S#,C#,SCORE)
(2)问题
  检索学习课程名为OS的女学生学号和姓名。
(3)关系代数表达式
  ΠS#,SNAMECNAME=’OS’∧SEX=’F’(CSCS))
(4)符号用Π、σ、×操作表示
  ΠS#,SNAMECNAME=’OS’∧SEX=’F’LC.C# = SC.C#∧SC.S# = S.S#(C×SC×S))))
  此处L是(C.C#,CNAME,T#,SCORE,S.S#,SNAME,AGE,SEX)。
  该表达式构成的语法树

(5)使用优化算法对语法树进行优化
   ①将每个选择操作分裂成两个选择运算,共得到四个选择操作:
   σCNAME=’OS’ σSEX =’F’ σC.C# = SC.C#    σSC.S# = S.S#
   ②使用等价变换规则,把四个选择操作尽可能向树的叶端靠拢。据规则可以把σCNAME=’OS’和σSEX =’F’移到叶端C和S处。
   σSC.S# = S.S#不能再往叶端移动了,因为它的属性涉及到两个关系SC和S,但σC.C# = SC.C#还可向下移,与笛卡儿积交换位置。
   然后根据规则,再把两个投影合并成一个投影ΠS#,SNAME
   原来的语法树变成了新的形式

   ③尽可能把投影移向叶端。也就是在每个选择操作后尽可能做投影操作,只挑选对后面操作有用的属性,来尽量减少中间结果。
   这样就形成新的语法树

   再以二元运算笛卡儿积为中心,用虚线划分了两个运算组。
   ④执行时从叶端依次向上进行,每组运算只对关系一次扫描。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多