- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
润乾集算报表提升性能之格间计算
润乾集算报表提升性能之格间计算
如果报表存在很多单元格间计算,会对其性能影响很大。这是因为1、单元格之间的计
算无法分步骤编写,很难优化。2、单元格计算可能会多次遍历单元格集才能完成。3、单元
格计算要利用较多的隐藏单元格作为中间变量,隐藏单元格除了单元格值外,还记录了很多
显示属性值,比如:字体、颜色、显示方式等等。虽然单元格隐藏了,但是这些属性还在,
而且带着这些属性计算,也会影响计算速度。
下面这个《雇员销售情况排名》报表就是比较典型的格间计算影响性能的例子:
报表要求按照员工姓名排序,根据订单总价来排名,并且计算“和上一名的差距”。下
面用格间计算来设计报表,并分析计算的性能:
首先定义sql 数据集ds1,其sql 如下:
SELECT EMPLOYEE.EID,MAX(EMPLOYEE.NAME) 姓名,sum(订单明细.数量*订单明细.单价) 订
单总价 FROM EMPLOYEE,订单,订单明细 WHERE 订单.订单 ID = 订单明细.订单 ID AND
EMPLOYEE.EID = 订单.雇员ID group by EMPLOYEE.EID order by 姓名
可以看到,由于输出结果要按姓名排序,就只能写作ORDER BY 姓名。
姓名、订单总价都是从数据库中用sql 计算出来,不需要讨论。
“排名”C2 单元格利用了格间计算,对每一行的订单总价,找出所有订单总价中比本
行值大的个数。也就是说每计算一个雇员的排名,就要遍历一边所有的订单总价。
类似地,D2 计算 “和上一名的差距”,要再做一次按条件寻找的层次坐标。这个遍历还
存在引用关系的处理,要等排名列计算完才能算差距列,但报表计算次序一般是从上到下的,
会导致多次失败的试算(试图计算某格,如果发现该格引用的格未计算就要存放等待着下一
轮再计算)而浪费时间。
因此,格间计算对订单总价遍历了n 次,n 是雇员个数。两个格间运算的总体复杂度是
2*N*N 。
采用润乾集算报表方案,可以编写过程化的集算脚本解决格间计算影响性能的问题。对
于这个报表,可以编写脚本如下(保存为sales.dfx ):
A
1 =connect(demo)
2 =A1.query(SELECT EMPLOYEE.EID,MAX(EMPLOYEE.NAME) 姓名,sum(订单明细.数量*
订单明细.单价) 订单总价,null 排名,0 和上一名的差距 FROM EMPLOYEE,订单,订
单明细 WHERE 订单.订单ID = 订单明细.订单ID AND EMPLOYEE.EID = 订单.雇
员ID group by EMPLOYEE.EID order by 订单总价 desc)
3 =A1.close()
4 =A2.run(#:排名,if(#!=1,订单总价[-1]-订单总价,0):和上一名的差距)
5 =A4.sort(姓名)
6 result A5
A1 :连接数据库。
A2 :用sql 计算订单总价,并且按照订单总价降序排序。
A3 :关闭数据库。
A4 :对A2 循环计算,“排名”等于当前记录的行号# ,“和上一名的差距”等于用上一
行的订单总价减去当前行的订单总价,如果是第一行就直接为0 。
A5 :按照姓名重新排序。
A6 :返回结果集给报表。
可以看到集算脚本中仅仅一次遍历加一次排序就完成了排名和上一名的差距的计算,也
不存在试算以解决引用关系的问题,所有计算都能一次成功进行。整体复杂度是N (遍历计
算)+N*logN (排序)
在报表设计器中定义集算数据集调用sales.dfx :
设计报表如下:
文档评论(0)