海量清单与分组报表的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

海量清单与分组报表的实现

背景

RDB

其他数据源

数据源层

报表展现

海量数据传输

报表呈现层

•报表有时需要呈现成百上千万甚至过亿记录,通常以清单列表方式呈现,少数情况以分组报表形式呈现

•我们称这种报表为海量数据报表,也称为:大报表

传统实现方式的局限

大部分情况是从RDB中查询数据,因此经常会使用数据库分页技术实现此类需求,但数据库分页有很大的局限

1

翻页效率差

每页都要执行单独SQL过滤数据,页数越大效率越低

2

数据不一致

由于每页是独立取数SQL,当有插入删除动作时,容易出现查询、统计错误

3

无法使用其他源

数据库分页技术只能基于RDB完成,无法使用文件、NoSQL等数据源

4

无法实现分组报表

由于每页SQL取数无法保证取出整组数据,因而也无法实现分组报表

还能想到哪些办法?

游标混用向数据库发出取数SQL生成游标,从

中取出一页后呈现,但并不终止这个游标,要取下一页的时候再继续取数向后翻页时用游标,一旦发生向前翻页时,则重新执行取数SQL

只能向后翻页解决问题不彻底

如何从根本上解决问题?

应用层面

取数和呈现做成两个异步线程

p 取数线程发出SQL后就不断取出数据并缓存到本地存储中,呈现线程根据页数计算出行数到本地缓存中去获取数据显示

p 只要已经取过的数据就能快速呈现,不会有等待感,还没取到的数据需要等待一下也是正常可理解的

p 取数线程只涉及一句SQL,在数据库中是同一个事务,也不会有不一致的问题

润乾大报表运行示意图

大报表引擎

A

B C D E

12345 (500)

用户

报表

数据源

文件系统

①请求

②游标读入

④展现第1页/共 页10000

③读取

如何做?实例

4个例子SQL源大报表

非SQL源大报表

带汇总的大报表

分组大报表

根据日期范围查询海量订单表的交易信息

1.报表模板

1.1设置参数

1.报表模板

1.2设置数据集

1.报表模板1.3报表表达式

2.设置大数据集

3.发布到WEB

needScroll="<%=scroll%>"

params="<%=param.toString()%>"

exceptionPage="/reportJsp/myError2.jsp"

scrollWidth="100%"

scrollHeight="100%"

rowNumPerPage="20"

fetchSize="1000"

needImportEasyui="no"

/>

其中rowNumPerPage属性为每页显示记录数;fetchSize为每次从数据源读取的数据量。完整发布的JSP可以参考报表安装目录下的样例文件:

[report\web\webapps\demo\reportJsp\ showBigReport.jsp]。

导出Excel

打印

如何做?实例

4个例子SQL源大报表

非SQL源大报表

带汇总的大报表

分组大报表

基于CSV的卫星数据,查询指定日期的风速、温度等详细信息

1.报表模板1.1设置参数

1.报表模板

1.2设置数据集使用“脚本数据集”基于文件实施计算

1.报表模板

1.3数据集内容

A1建立文件游标;

A2在游标执行时对数据进行过滤(此时游标尚未执

行,数据并未取出);

A3返回游标过滤结果,为报表提供数据。

依次编辑报表表达式、设置大数据集、发布报表(同上)

展现效果

如何做?实例

4个例子SQL源大报表

非SQL源大报表

带汇总的大报表

分组大报表

查询订单信息(例1),并显示汇总数据(数量、总额、运费)

1.报表模板

1.1设置参数

1.报表模板

1.2增加数据集

统计汇总数据

报表中最后一行引入ds2汇总值进行呈现,这里为了每页都包含汇总数据,设置最后一行属性为报表尾

展现效果

如何做?实例

4个例子SQL源大报表

非SQL源大报表

带汇总的大报表

分组大报表

分组大报表

根据订单数据,查询按地区分组的明细及订单金额汇总

分组大报表实现难点

SQL难以满足需要

含有明细的分组报表无法在数据源环节聚合,例如用SQL聚合后就不再包含明细数据了;如果将汇总和明细分别查询再拼接,不仅因查询两次而严重影响性能,而且也难以按次序将汇总数据再插入到明细数据中。如何在应用端实现?

由数据计算层在接收源数据时计算分组汇总值,并在合适位置将汇总值插入到数据流中,作为大报表的数据源,再使用前述的大报表呈现方案

新建大报表,设置报表参数

设置大报表“脚本数据集”,编写计算脚本

SQL需按分组字段排序

相关文档
最新文档