zoukankan      html  css  js  c++  java
  • 用润乾集算报表提升性能之关联计算

             报表开发过程中常常要在报表中完毕数据关联计算,有的为了减少报表制作复杂度将关联关系放到可视的报表模板中完毕;有的则必须在报表中完毕关联,如多数据源、异构数据源的情况。而在报表中做关联往往导致报表效率不高,计算过慢,引发性能问题。润乾集算报表提供了特殊的数据关联方式,能够提升报表性能。这里通过一个常见的多源关联分片报表实例来看一下集算报表的实现过程:

    报表说明

             依据销售情况等信息表依照时间、地区、销售人员、产品等维度汇总销售额,报表样式例如以下:


    编写计算脚本

             首先使用集算器编写脚本,完毕数据关联,并为报表返回关联后结果集:

             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倍),因而使用集算器关联后获得超过一倍的性能提升。

             此外,集算器也很适合处理异构数据源数据关联,如常见的多数据库、文件和数据库混合的情况。

             下附执行日志和測试机配置。

    【附1】执行日志

    报表中关联

    [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 ]  - 计算结束:

    dfx中关联

    [2014-09-15 11:56:33] : [INFO ]  - 開始运算报表,首先取数......

    [2014-09-15 11:57:11] : [INFO ]  - 取数结束,開始运算

    [2014-09-15 11:57:26] : [INFO ]  - 计算结束:

    【附 2】測试机配置

    測试机型: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


  • 相关阅读:
    TypeError: run() missing 2 required positional arguments: 'rerun' and 'save_last_run'
    在wsl的ubuntu上安装vcpkg
    vscode + WSL +Ubuntu编程解决方案
    clion debug模式带参数运行程序
    关于jdk1.7之后String的intern方法的一点理解
    关于java中split的坑
    关于向HashMap存放数据出现顺序混乱的问题
    oracle外键禁用
    oracle复杂查询(二)
    oracle复杂查询(一)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4346403.html
Copyright © 2011-2022 走看看