在进行自定义公式计算的算法设计中,有个问题困惑了很久,即:公式计算的优先次序。
在进行公式的优先级排序过程中,如果存在循环公式,则优先级的最大级别不好确定。
通过分析存贮计算公式的数据表可以看出,数据结构是按照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/