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

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

但是,报表并不是直接使用原始数据进行呈现,还需要做进一步的运算。而文件本身没有计算能力,这种情况数据量一般也较大,不可能靠报表呈现端的计算能力实现。

集算报表在内置集算引擎的帮助下可以基于库外文件做计算,支持的文件类型包括:文本、Excel、JSON格式文件等,还支持效率更高的二进制文件。将较大数据量的历史数据从数据库中剥离,这样除了可以满足历史查询类报表的性能需求外,还可以借助集算报表对混合数据源(文件+数据库)的支持,进行大数据量的实时数据查询,从文件系统中读取往期较大的历史数据,从数据库中读取当期较小的实时数据进行混合计算。这样的做法可以避免数据库的IO瓶颈,快速提升报表性能,增大数据查询范围。同时,这也是优化数据库的过程,将历史数据移出,数据库可以专注于保证业务系统数据的一致性,而不是耗费资源在大量的历史查询任务上。

具体使用上,当用户将数据保存到文件系统中后,即可使用集算报表进行数据查询和计算,集算报表内置的集算引擎可以基于文件(和数据库)进行数据计算。使用时,可以参考如下步骤(举例说明):

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

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

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

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

当数据外置后,采用集算报表就如同使用文件数据源做报表了,比如根据订单明细数据按客户统计订单数量和订单金额,由于原始订单数据非常大,所以读入文件时采用流式(文件游标)的方式逐步读入。

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

脚本:

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

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

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

A4:为报表返回结果集。

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

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

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

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

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

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

通过以上的过程可以清晰的看到,集算报表可以很好解决针对往期历史(+当期)数据进行查询时往往存在性能不高的问题,通过数据外置提升报表性能。

时间: 2024-08-04 21:36:51

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

jango 模型管理数据model,数据库外键主键与一对一,一对多,多对多关系

四.models.py 定义和管理模型: 4.1模型class的属性就映射与数据库的字段参数 继承models.Model class TestClass(models.Model): 4.2在数据库生成数据表: #django默认在makemigrations会为表对象创建主键id,id = models.AutoField(primary_key=True) 你也可以自定义一个主键对象: 4.2.1: 生成迁移文件python manage.py makemigrations 4.2.2执行

B-树和B+树的应用:数据搜索和数据库索引

B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点,则至少有两棵子树: ⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树:⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A1,K2,-,Kn,An)其中:Ki(i=1,2,-,n)为关键码,且Ki<Ki+1,  Ai 为指向子树根结点的指针(i=0,1,-,n),且指针Ai-1 所指

转:基于B-树和B+树的使用:数据搜索和数据库索引的详细介绍

原文地址:http://www.jb51.net/article/36184.htm B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点,则至少有两棵子树: ⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树:⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A1,K2,-,Kn,An)其中:Ki(i=1,2,-,n)为关键码,且Ki<

B-树和B+树的应用:数据搜索和数据库索引【转】

B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树: ⑵若根结点不是叶子结点,则至少有两棵子树: ⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树: ⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A1,K2,-,Kn,An) 其中:Ki(i=1,2,-,n)为关键码,且Ki<Ki+1,  Ai 为指向子树根结点的指针(i=0,1,-,n),且指针Ai-

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml,然后将截取的节点字段值插入到已经建好相应结构的表中.并记录日志. xml结构概要如下: <?xml version="1.0" encoding="UTF-8"?> <list> <info> <id>93ef7c7ccc

excel数据导入导出数据库

第一种方法: 先把Excel另存为.csv格式文件,如test.csv,再编写一个insert.ctl 用sqlldr进行导入! insert.ctl内容如下: load data          --1.控制文件标识 infile ‘my.csv‘          --2.要输入的数据文件名为my.csv append into table "tbl_test"   --3.向表table_name中追加记录 fields terminated by ‘,‘          

php批量上传图片并把图片名放入数据库

    前几天工作中要做这样一个功能,有八百多个系统 生成的会员:给这八百多个系统会员上传图片:然后把图片名放入数据库. 第一步: 第一步肯定是首先把图片上传到对应的图片目录下,直接用框架中已经有的上传类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!--?php                try {                     $upload=new Upload();       

Spring Security 3 (三) 用户数据存放于数据库

上章回顾: 上一章中,我们将用户名.密码以及用户对应的角色都配置于applicationContext-security.xml中,基本实现了我们能控制用户的访问权限.但是在现实开发中,我们不可能将用户信息硬编码在配置文件中,通常我们都是存放到数据中.同时我们应该对用户的密码进行加密存储. 目标: 1.将用户信息存放于数据库 2.对用户的密码进行加密 详细操作: 1.其他代码参考上一章中代码.本章中,首先我们要创建一张数据表来记录我们的用户信息.SpringSecurity提供的验证机制中,首先

将Excel上千条数据写入到数据库中

简要说明:因工作需要,需要一张Excel表格中的所有数据导入到数据库中.如下表,当然这只是一部分,一共一千多条. 前期处理: 首先要保证上图中的Excel表格中的数据不能为空,如果有为空的数据,可以稍微进行处理,比如将所有为空的数据替换成加一个空格.(我的这个解析器只能解析Microsoft Excel 97-2003 工作表 (.xls)这个格式的表格,如果不是这个形式的需要进行转化.) 然后就是找一个添加页面,添加一个上传附件的功能,即添加一个type类型为file的input标签.比如 <