关于公式计算优先次序的算法

      在进行自定义公式计算的算法设计中,有个问题困惑了很久,即:公式计算的优先次序。

      在进行公式的优先级排序过程中,如果存在循环公式,则优先级的最大级别不好确定。

      通过分析存贮计算公式的数据表可以看出,数据结构是按照Parent_wdm,wdm的树形逻辑组织的,如此,利用树形的固有特点,采用集合减的方法,最后解决了该问题。同时,对循环公式也给出了明确的答案。算法如下:

    LOOP
      BEGIN
        UPDATE GT_HZ_WDGS_ALL A
           SET A.GSJB = VN_J
         WHERE a.gsjb=1 and a.wdm in
               (SELECT Parent_wdm FROM GT_HZ_WDGS_ALL WHERE GSJB = 1
                MINUS
                SELECT wdm FROM GT_HZ_WDGS_ALL WHERE GSJB = 1);
        LS_FIND := SQL%ROWCOUNT;
        IF LS_FIND = 0 THEN
             -- 存在循环公式
             EXIT;
        END IF;
        VN_J := VN_J + 1;
      END;
    END LOOP;

该算法的优点是从树根逐层剥离计算元素直至树梢;缺点是要对公式表 GT_HZ_WDGS_ALL 进行3次全表扫描,2次排序,1次Hash Join。当公式表中记录达到百万级时,基本上要在临时表中完成排序的操作,处理时间大概9分钟。但是即便如此,该算法也远远高于原来的算法(原算法执行2小时)。同时,该算法的好处是当返回0记录时,如果表中尚存有未处理的记录,则全部是循环公式的内容。


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16496023/viewspace-610840/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16496023/viewspace-610840/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值