报表开发过程中经常要在报表中完成数据关联计算,有的为了降低报表制作复杂度将关联关系放到可视的报表模板中完成;有的则必须在报表中完成关联,如多数据源、异构数据源的情况。而在报表中做关联往往导致报表效率不高,计算过慢,引发性能问题。润乾集算报表提供了特殊的数据关联方式,可以提升报表性能。这里通过一个常见的多源关联分片报表实例来看一下集算报表的实现过程:
根据销售情况等信息表按照时间、地区、销售人员、产品等维度汇总销售额,报表样式如下:
以下为实现过程。
首先使用集算器编写脚本,完成数据关联,并为报表返回关联后结果集。
A1:连接数据源;
A2-A5:执行sql分别取订单、产品等表数据;
A6-A8:使用switch将多表数据完成关联,关联结果存入A2格中;
A9:根据已关联结果创建新序表,结果集通过A10为报表返回。
在集算报表设计器中新建报表模板后,数据集选择“集算器”,在数据集编辑窗口指定上述编辑好的dfx文件,完成数据集创建。
设置报表模板表达式:
不同于在报表中关联,集算报表在报表模板中直接根据集算脚本返回的一个结果集完成分组报表的制作,从而获得了更高的性能。
数据集
ds1: SELECT 客户.地区,客户.城市,订单明细.数量,订单明细.折扣,订单明细.单价,订单.雇员ID,订单.订购日期,订单明细.产品ID FROM 订单明细,订单,客户 WHERE 客户.客户ID = 订单.客户ID AND 订单.订单ID = 订单明细.订单ID and 订单.订购日期 is not null
ds2: SELECT 类别.类别ID,类别.类别名称 FROM 类别
ds3: SELECT * from 雇员
ds4: SELECT 产品.类别ID,产品.产品ID FROM 产品
报表模板
本例中测试的源表数据量为40多万条,的基于同样的取数sql,下表展示了使用集算报表测试1在报表中关联 2使用集算脚本关联后将结果传递给报表进行报表展现的运行时间对比:
可以看到集算报表在处理关联计算类报表的优势,由于在报表完成关联时只能使用遍历算法(针对单条主记录去寻找关联的子记录),因此效率不高。而集算器采用了更高效的hash关联方案(可事先将所有子记录按对应码hash到主记录上,代码中的switch函数即使用了hash关联技术,单算关联时间能快出5-10倍),因而使用集算器关联后获得超过一倍的性能提升。
此外,集算器也非常适合处理异构数据源数据关联,如常见的多数据库、文件和数据库混合的情况。
下附运行日志和测试机配置。
[2014-09-15 11:32:59] : [INFO ] - 开始运算报表,首先取数......
[2014-09-15 11:32:59] : [DEBUG] - 下面开始打出sql
[2014-09-15 11:32:59] : [DEBUG] - ds1=SELECT 客户.地区,客户.城市,订单明细.数量,订单明细.折扣,订单明细.单价,订单.雇员ID,订单.订购日期,订单明细.产品ID FROM 订单明细,订单,客户 WHERE 客户.客户ID = 订单.客户ID AND 订单.订单ID = 订单明细.订单ID and 订单.订购日期 is not null
[2014-09-15 11:33:35] : [DEBUG] - 下面开始打出sql
[2014-09-15 11:33:35] : [DEBUG] - ds2=SELECT 类别.类别ID,类别.类别名称 FROM 类别
[2014-09-15 11:33:35] : [DEBUG] - 下面开始打出sql
[2014-09-15 11:33:35] : [DEBUG] - ds3=SELECT * from 雇员
[2014-09-15 11:33:35] : [DEBUG] - 下面开始打出sql
[2014-09-15 11:33:35] : [DEBUG] - ds4=SELECT 产品.类别ID,产品.产品ID FROM 产品
[2014-09-15 11:33:35] : [INFO ] - 取数结束,开始运算
[2014-09-15 11:34:58] : [INFO ] - 计算结束:
[2014-09-15 11:56:33] : [INFO ] - 开始运算报表,首先取数......
[2014-09-15 11:57:11] : [INFO ] - 取数结束,开始运算
[2014-09-15 11:57:26] : [INFO ] - 计算结束:
测试机型:Dell Inspiron 3420
CPU:Intel Core i5-3210M @2.50GHz *4
RAM:4G
HDD:西数WDC(500G 5400转/分)
操作系统:Win7(X64) SP1
JDK:1.6
数据库:oracle11g R2
集算报表版本:5.0