zoukankan      html  css  js  c++  java
  • 实现报表数据外置计算

    在报表应用中,针对历史数据查询的报表占比很大,这类报表的特点是:第一,数据变化小,查询的历史数据几乎不会发生变化;第二,数据量大,而且还会随时间不断增加。如果这些历史数据始终存放在数据库中,由于大多数数据库的 JDBC 性能都很低下(取数过程的数据对象转换比从文件中读取数据慢一个数量级),当涉及数据量较大或并发较多的时候,报表的性能会急剧下降。显然,如果能将这些变化不大的历史数据移出数据库,采用文件系统存储,就可以获得比数据库高得多的 IO 性能,从而提高报表的整体性能。

    但是,报表并不能直接使用原始数据,都需要运算(比如查询汇总)之后再进行呈现,而文件本身没有计算能力,因此无法提供报表需要的结果。此外,使用文件存储的数据量一般都很大,仅靠报表呈现端很难实现高效的计算。

    对于润乾报表来说,这种需求完全可以在内置集算引擎的帮助下做到,称为库外文件计算,或数据外置计算。所支持的文件类型包括:文本、Excel、JSON 格式文件等,还支持效率更高的二进制文件。

    通过数据外置计算,将较大数据量的历史数据从数据库中剥离,除了可以满足历史查询类报表的性能需求外,还可以实现混合数据源(文件 + 数据库)的计算,进而实现大数据量的实时数据查询,比如从文件系统中读取往期大量的历史数据,从数据库中读取当期较小量的实时数据进行混合计算。由此,一方面可以避免数据库的 IO 瓶颈,快速提升报表性能,增大数据查询范围;另一方面,将历史数据移出,数据库可以专注于保证业务系统数据的一致性,而不是耗费资源在大量的历史查询任务上,这也是一种数据库优化的手段。

    下面用一个例子说明润乾报表实现数据外置计算(结合集算器实现)的步骤:

    1、 将数据库中历史数据导出到文件

    用户可以自行选择适当的方法将历史数据导出到文件,当然这个过程也可以使用集算器来做,比如将数据导出到文本。如果希望更高的性能,还可以使用比文本能快 2-5 倍的二进制文件格式。在集算器中使用以下代码可将文本文件转换成二进制格式。

    file("E:/订单明细.b").export@b(file(“E:/订单明细.txt”.cursor()) 

    2、 使用润乾报表内置的集算引擎读取数据文件

    当数据外置后,润乾报表可将文件作为数据源来设计报表,比如根据订单明细按客户统计订单数量和订单金额,由于原始订单数据非常大,所以读入文件时采用流式(文件游标)的方式逐步读入。

    脚本中使用的参数及其含义如下:

    脚本:

                                 

     A
    1 =file(“E:/ 订单明细.txt”).cursor@t()
    2 =A1.select(货主国家 ==county && 货主地区 ==area && 货主城市 ==city && 订购日期 >=begin && 订购日期 <=end)
    3 =A2.groups(客户 ID;count( 订单 ID): 订单数量,sum(订单金额): 订单总额 )
    4 return A3

    代码说明:

    A1:通过文件游标采用流式处理的方式读入大文本;

    A2:按照指定的多个维度进行数据过滤,结果仍然是游标;

    A3:根据选出的结果,按照客户 ID 汇总订单数量和订单金额;

    A4:为报表返回结果集。

    前面提到,润乾报表既可以针对单独的文件(导出的历史数据)进行查询计算,还可以进行文件 + 数据库的混合运算,进行大数据量实时查询。

                                                               

     A
    1 =file(“E:/ 订单明细.txt”).cursor@t()
    2 =A1.select(订购日期 >=begin && 订购日期 <=end)
    3 =A2.groups(客户 ID;count( 订单 ID): 订单数量,sum(订单金额): 订单金额 )
    4 =connect(“cmos”)
    5 =A4.cursor(“select 客户 ID,count( 订单 ID) 订单数量,sum(订单金额) 订单金额 from 订单明细 where 货主国家 =? and 货主地区 =? and 货主城市 =? and 订购日期 >? and 订购日期 <? group by 客户 ID”,county,area,city,begin,end)
    6 =[A3,A5.fetch()].conj()
    7 >A4.close()
    8 =A6.groups(客户 ID;sum( 订单数量): 订单总量,sum(订单金额): 订单总额 )
    9 return A7

    代码说明:

    A1-A3:与上一个脚本一样,汇总历史数据;

    A5:根据指定参数执行 sql,汇总当期数据;

    A6:将两部分汇总数据合并(纵向拼接);

    A8:根据合并后的历史和当期汇总数据再次汇总,得到各客户的订单数量和订单金额。

    3 在润乾报表中调用集算脚本,编辑报表表达式完成报表制作

    数据集配置如下:

    报表配置如下:

    通过以上过程可以清晰的看到,润乾报表可以通过数据外置提升报表性能,解决对往期历史 + 当期数据进行查询时性能不高的问题。

  • 相关阅读:
    火狐黑客插件
    使用POI对EXCEL 读入写出
    使用spring quartz实现定时任务
    toad for oracle 快捷键总结
    Oracle查询性能优化
    2.C语言中文网学习Python
    1.编程基础(C语言中文网)
    一键打开ASP.NET WEB网站项目
    解决VS2010无法添加Sql Server数据库的问题
    VS2010 的一个小Bug(已报告给Microsoft Connect并得到确认)
  • 原文地址:https://www.cnblogs.com/IBelieve002/p/10875653.html
Copyright © 2011-2022 走看看