基于文件系统实现可追加的数据集市

该博客探讨了在数据库压力增大时,通过将历史数据移出数据库,利用文件系统存储来提升大数据量报表查询性能的问题。文章介绍了通过润乾集算器将文件赋予计算能力,实现数据外置,从而提高查询效率。详细阐述了数据存储组织、数据同步、日志追溯、定时任务等实施步骤,并展示了如何利用集算器进行数据查询,强调了这种方法的管理便捷性、低成本和资源利用率高等优点。
摘要由CSDN通过智能技术生成

一 问题背景

 

绝大多数的应用系统中,一开始数据的存储和计算基本都是由数据库来完成的,同时服务于业务交易和报表查询;不过在经过几年信息化建设和数据积累后,常常都会遇到数据库压力变大,从而导致性能瓶颈的问题。

究其原因,往往发现针对历史数据查询的报表在其中占了很大比重。进一步分析会发现,这类报表通常都有如下特征:

1、数据变化小:供查询的历史数据几乎不再发生变化;

2、数据量大:数据量随时间不断增加;

由于大多数数据库的JDBC性能都很低下(JDBC取数过程要做数据对象转换,比从文件中读取数据会慢一个数量级),如果数据始终存放在数据库中,当涉及数据量较大或并发较多的时候,报表的性能会急剧下降,进一步还会严重影响相关的业务操作,如市场营销、数据整理再汇报等。

针对这一问题,常见的解决方案是在生产库和应用之间再增加一个前置数据库,利用ETL工具定时从生产库中提取数据,清洗后再导入到前置数据库中,所有的历史报表查询都基于前置数据库,从而和生产库分离,缓解生产库压力。

不过这种方案增加了很多不必要的成本、多余的组件和工作量,同时也加大了后期的管理和维护难度;更为重要的是,当数据量比较大时,报表查询还是很慢,因为上面已经提到过的根本问题并没有得到解决,大多数数据库的IO性能远低于文件系统,而报表性能又严重依赖于数据库取数环节,也就是说,没能从根子上解决问题。

二 解决思路

要从根子上解决问题,我们可以假设如果文件拥有计算能力的话,将这些变化不大的历史数据搬出数据库,采用文件系统存储,而不是前置数据库,那么将可能获得比数据库高得多的IO性能,这样不仅能够解决大数据量报表查询慢的难题,我们还将获得如下这些好处:

1、管理方便;文件天然支持多级目录,而且复制、转移、拆分都比数据库简单、高效得多,这样,用户就可以按照业务模块、时间顺序等规则分类管理数据,在应用程序下线时,也可以按照目录删除该应用对应的数据。数据管理因此变得简单清晰,工作量显著降低。

2、成本低廉;既然是文件,那就可以简单地存储在廉价硬盘中,无需购买昂贵的数据库专用软硬件。

3、降低数据库扩容压力;数据库吞吐负担降低,就可以显著推迟扩容临界点的到来,数据库可以继续服役,也可以节省大量的扩容成本。

4、资源利用率高;用文件来存储数据并非要抛弃数据库,相反的,文件应当只存储安全要求不高、但数据量巨大的外围数据以及库外文件,而数据库仍然存储核心数据。如此一来,文件存储和数据库存储各司其职,资源利用率显著提高。

那么,如何才能有效地为文件赋予计算能力呢?下面将要介绍的润乾集算器,就是这样一款利器,通过集算器,可以实现复杂计算与报表展现的分离,其内置的集算引擎可以使文件拥有计算能力,轻松应对各种疑难杂症。下图显示了常规情况和引入集算器后的报表系统结构对比,应该说,引入集算器后,整个体系架构变得更加清新与合理了:

undefined

三 场景说明

接下来,我们通过一个典型的场景来说明集算器的作用和用法:

A表“商品销售明细”的数据量上亿,其中字段areaid与B表“区域表”的主键id关联。A表称为事实表,B表称为维表。A表中与B表主键关联的字段称为A指向B的外键,B也称为A的外键表。外键表是多对一的关系。如下图示:

undefined

下面,我们就通过制作“各区域销售员每日销售额日增长率报表”,来看一下集算器是如何利用文件实现数据外置,从而提升报表查询效率的。报表最终的展示效果如下图:

undefined

在这张报表中,根据选择开始日期、结束日期进行查询,报表先按照区域名称、销售员代码、销售日进行分组,统计每个销售员每天的销售额,以及每个销售员每天销售额的日增长率(算法为“(当日销售额-上一日的销售额)/上一日的销售额”)。报表上部的查询按钮是报表工具提供的“参数模板”功能,具体做法参见教程,这里不再赘述。

3.1设计数据存储组织

在利用文件系统存储数据的诸多优势之前,我们首先应该先定义文件的目录存储结构:

历史数据的特征是交易成型后数据落地不再变化,而且数据量庞大,由此我们可以将每年的数据按照业务模块、月份等规则进行划分,即每个月份的数据存一份集文件(集文件利用集算器提供的压缩格式,具有更好IO性能)。目录结构就是:/业务模块/数据明细表/年月文件名,如下图所示:

undefined

同时,我们还需要设定每天凌晨时段定时执行数据同步脚本,把前一天的数据追加到当月集文件中;而在每月1号,脚本还会根据规则自动生成一个新的以年月命名的集文件。

3.2同步数据

3.2.1同步历史数据到文件

先把2017年1到10月的历史数据按不同月份搬出来(假定已有10个月的历史数据),集算器的SPL脚本如下:

 

A

B

C

1

=connect("demo")

   

2

=10.("SELECT   * FROM sdrpts WHERE filedate>='2017-"/~/"-01'AND   filedate<'2017-"/(~+1)/"-01'")

3

for A2

=file("D:/进销存/商品销售明细/2017"+string(#A3,”00”))

4

 

=A1.cursor(A3)

>B3.export@ab(B

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值