报表系统性能提升之预先计算

报表应用中当数据量较大或计算过程较复杂时,会导致报表数据源准备过慢,从而影响报表性能。这时常常需要事先将报表需要的数据计算好,在呈现时直接引用即可,这样用户在访问报表时就可以迅速地获得响应。

当前的手段及弊端

由于报表在访问时还需要参数,显然不可能把所有参数组合对应的报表数据源都准备好,所以预先计算并不是最终的报表结果,在呈现的时刻仍然要再次进行一些简单的计算(如过滤、分组汇总、排序等),然而也不太可能指望报表呈现时刻由报表工具再完成所有这些运算(报表工具只能完成一部分小数据量的运算),这样就要求存储的中间数据有再次计算的能力。所以一般情况下会将中间数据采用中间表的形式存储在数据库中。

但是,使用中间表会加大数据库负担,将过多的计算工作交给数据库做,无疑会加大数据库的压力,有时反而会造成性能不升反降;而且,中间表太多还容易导致管理混乱,由于数据库采用非层次结构(与文件系统的树形结构相比),大量存在的中间表往往会引起数据库管理难题;此外,数据量稍大从数据库中读取数据还会出现I/O瓶颈,导致报表性能表现不佳。

集算报表的解决方案

集算报表的预先计算方案不需要使用数据库中间表,从而可以避免上述弊端。集算报表内置的运算引擎拥有完整的计算能力,可以允许中间数据存放在文件中,报表使用中间结果文件再次计算得到报表数据源,从而缩短报表计算时间,提升报表性能。

这种方式与使用数据库中间表有些类似,都需要事先计算准备数据,但也有很大的不同:第一,不会占用昂贵的数据库空间,不会增加数据库负担,第二,不会引起数据库组织混乱,第三,数据量大时不会出现IO瓶颈。集算报表之所以能够完成预先计算并将结果保存在文件中,得益于集算报表内置了专门用于数据计算的集算引擎及其与文件系统的无缝交互(读入和输出),可以读取多种文件格式,如常见的文本、Excel等,也包括效率更高的二进制文件,从而使文件具备再计算的能力,实现报表预先计算。

具体使用上,集算报表允许将部分甚至全部中间计算结果保存到文件中,报表被访问时通过用户给定的参数,基于结果文件再次计算最终将报表数据呈现给用户。使用集算报表进行预先计算可以通过如下步骤实现(举例说明):

1、将需要的中间结果保存成文件

中间结果计算好后可存成文件,集算报表可以支持常见的文本文件格式,例如将订单明细分组汇总后的数据存放在文本(orderDetail.txt)中,如果希望更高的性能,集算报表还可以支持更高效的二进制文件格式(比文本能快出2-5倍)。在集算器(用免费版本即可)中执行如下类似的代码可将文本文件转换成二进制格式。

file("E:/订单明细.b")[email protected](file(“E:/订单明细.txt”.cursor())

当然,生成中间数据的过程本身也可以采用集算器,但非本文关注点,此处不详述。

2、 基于中间数据文件生成报表源

集算报表可以直接基于文件数据源进行再次计算,得到报表数据源,以过滤为例。

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

其中cols为选出列名,where为过滤条件(参数传递时拼接成上述格式),num为取出的记录数。

脚本内容:

上述脚本是基于最近5年订单初步汇总的中间结果进行过滤和分组汇总操作,其中:

A1:通过文件游标采用流式处理的方式读入大源文本数据,此处支持选择列,用户可以根据参数控制选出的数据列;

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

A3:根据指定的选出结果数量,使用游标取出记录;

A4:为报表返回结果集。

上述脚本是处理的一个中间结果文件,如果需要从多个文件中同时查询数据,脚本可以这样编写(以2个为例):

由于中间数据文件是按年份存储(每5年一个),如果要查询1996到2005年间的数据,需要读取2个文件,脚本中A3对两个文件的游标进行了纵向拼接,合并成一个游标,然后采用与第一个脚本相同的方式进行处理。当查询的数据范围继续扩大,需要多个文件的时候,可以通过循环的方式将多个文件游标进行纵向拼接合并。

3 、在集算报表中调用集算脚本,编辑报表表达式完成报表制作,这是报表制作的常规动作了,不再赘述。

与一般优化方式类似,预先计算也有其适用的场景。使用预先计算来提高报表性能要充分考虑计算的类型,对某些计算过程容易拆分的场景比较适合使用预先计算,如经常要对某些大表汇总数据后与其他表做连接,这样就可以先将大表汇总数据预先计算出来保存,再与其他表做连接计算;还有数据的实时性要求也要充分考虑,比如在历史查询类的报表中就比较适合使用预先计算,当然开发人员也可以采用其他手段来保证数据的实时性要求。

一般报表工具不具备针对文件的计算能力,要实现类似的效果往往要借助数据库进行,使用数据库的中间表会存在开篇我们提到的几点问题,有时会适得其反,从这个角度也充分体现了集算报表的价值。

集算报表免费版下载:http://www.raqsoft.com.cn/?p=208.

时间: 2024-08-30 12:06:17

报表系统性能提升之预先计算的相关文章

将数据放至数据库外或文件系统来提高报表系统性能

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

阿姆达尔Law对系统性能提升的定义

阿姆达尔定律 = Amdahl's Law,本篇重点是介绍该定律. 背景系统架构中对系统性能设计的解决方案之一:"阿姆达尔方案".书中还有个完全看不懂的公式,理解起来脑仁痛(不懂...)但发现很有价值,便系统的学习一下. 例题试先做一下,带着疑问点再看定律. 例题:假设某一功能的处理时间为整体系统运行时间的60%,若使该功能的处理速度提高至原来的5倍,则根据阿姆达尔定律,整个系统的处理速度可提高至原来的多少倍? 定理公式优化前系统总耗时To(old),优化后系统总耗时Tn(new),加

Windows系统性能提升方法

看前提醒:在确认没有病毒和流氓软件的前提下,建议优化电脑:以下操作已经在Win7上试验,Win7以的园友自己试验,自己感受,对电脑无害,但操作时请务必小心 设置虚拟内存 虚拟内存最小值物理内存1.5—2倍,最大值为物理内存的2—3倍的固定值,并转移到系统盘以外的其他分区. 虚拟内存设置方法是: 右击计算机—属性--高级系统设置--高级--性能--设置--高级--虚拟内存--更改--在驱动器列表中选中系统盘符--自定义大小--在“初始大小”和“最大值”中设定数值,然后单击“设置”按钮,最后点击“确

润乾集算报表提升性能之预先计算

报表应用中当数据量较大或计算过程较复杂时,会导致报表数据源准备过慢,从而影响报表性能.这时常常需要事先将报表需要的数据计算好,在呈现时直接引用即可,这样用户在访问报表时就可以迅速地获得响应. 当前的手段及弊端 由于报表在访问时还需要参数,显然不可能把所有参数组合对应的报表数据源都准备好,所以预先计算并不是最终的报表结果,在呈现的时刻仍然要再次进行一些简单的计算(如过滤.分组汇总.排序等),然而也不太可能指望报表呈现时刻由报表工具再完成所有这些运算(报表工具只能完成一部分小数据量的运算),这样就要

报表工具与报表性能的关系

在选择报表工具时,性能指标一向是用户非常关心的,但是,报表工具的性能和整个报表系统的性能会有多大关系呢? 要回答这个问题,首先要分析一下报表的处理过程包含哪些环节,其中有哪些环节容易出现性能问题,如何优化这些环节. 一.报表处理的一般过程分析 1.用户选择报表输入参数后,报表引擎会根据报表模板和输入参数来解析报表,并将数据计算和读取请求以SQL的方式发送给数据库. 2.数据层负责读取.计算和返回数据.数据层一般都是传统关系数据库:如Oracle.DB2等. 3.数据层通过JDBC等接口将结果数据

Android/Linux 系统性能调优

关于性能优化这是一个比较大的话题,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法.本文的东西是我的一些经验和知识,并不一定全对,希望大家指正和补充. 在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的<代码优化概要>,这篇文章基本上告诉你--要进行优化,先得找到性能瓶颈! 但是在讲如何定位系统性能瓶劲之前,请让我讲一下系统性能的定义和测试,因为没有这两件事,后面的定位和优化无从谈起. 一.系统性能定义 让我们先来说说如何什么是系统性能.这个定义非常关键,如果我们不清楚

去哪儿网大数据流处理系统:如何使用Alluxio(前 Tachyon)实现300倍性能提升

概述 互联网公司同质应用服务竞争日益激烈,业务部门亟需利用线上实时反馈数据辅助决策支持以提高服务水平.Alluxio(前Tachyon)作为一个以内存为中心的虚拟分布式存储系统,在大数据系统性能提升以及生态系统多组件整合的进程中扮演着重要角色.本文将介绍去哪儿网(Qunar)的一个基于Alluxio的实时日志流的处理系统,Alluxio在此系统中重点解决了异地数据存储和访问慢的问题,从而将生产环境中整个流处理流水线的性能总体提高了近10倍,而峰值时甚至达到300倍左右. 目前,去哪儿网的流处理流

性能调优攻略

关于性能优化这是一个比较大的话题,在<由12306.cn谈谈网站性能技术>中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法.本文的东西是我的一些经验和知识,并不一定全对,希望大家指正和补充. 在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的<代码优化概要>,这篇文章基本上告诉你--要进行优化,先得找到性能瓶颈! 但是在讲如何定位系统性能瓶劲之前,请让我讲一下系统性能的定义和测试,因为没有这两件事,后

柯南君:教你如何对待大型网站平台的性能优化? 之 二--- 应用程序调优 (长篇总结)

柯南君:教你如何对待大型网站平台的性能优化? 之 "二"--- 应用程序调优(长篇总结) 柯南君 上一章 <柯南君:教你如何对待大型电商平台的性能优化?之 一 (方法.指标.工具.定位)>讲到了一些测试方法.测试指标.以及测试工具.稍微讲了一些如何定位的方法?这一章主要讲一下"如何优化应用程序,将其性能提升". 一.基本知识  1.下面讲一些JAVA 程序性能方面的一些看法,首先给大家讲一下应用程序调优,需要调优哪些项? ① 运算的性能 : 看哪一个算法