海量清单与分组报表的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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需按分组字段排序