大量的中间表会占用很大的大数据库存容量,甚至有些已经不用的中间表还在定时更新数据,在不断的变大,那么多表,我们又不知道哪个有用哪个没用,不敢乱删,只能放任其不断的增多、变大,容量告警时,就只能被迫进行数据库的扩容,而扩容,是需要很大成本的,不管是横向还是纵向。怎样解决中间表的危害?
怎么解决
中间数据的思路是没有大问题,有问题的是把它们存到数据库里这个环节
那存到库外不就可以了吗?这个想法很好,但之前因为技术限制,存到库外后会让续的计算变的复杂,很少有这么做的
中间表是要再计算的,基于中间表查询的报表还要进行数据过滤,有的还要再次汇总,还可能涉及关联计算,这些操作在数据库里通过 SQL 完成很简单,但是文件没有计算能力,要实施这些计算只能硬编码,用 JAVA 来做,使用 JAVA 来做集合运算又非常麻烦,远没有数据库(SQL)方便,所以很少有人把中间表存在库外
但现在有新技术了,集成了 SPL 集算器的硕迪报表,让这种想法变的可行了

SPL 是一款流行的专业的数据计算处理工具,很多项目开发商都在用,因为它不仅好用,而且还免费,开源,是常年做项目,总需要做数据处理的工程师的好帮手
用文件存储中间数据
集成了 SPL 以后,硕迪报表就有了计算文件数据的能力,这样数据库的大量中间表就可以都移到了库外了,用普通的 TXT 或者其他方式存储都可以,也可以用 SPL 独有的的更高性能的二进制文件,报表直接可以对接他们来算
比如要查询 2012 年销售总额超过 800 万的地区及销售金额
就可以提前汇总数据,并把中间结果用文件存储的方式存储,而不需要放到数据库中

然后报表直接针对文件数据查询计算就可以

=file("order_year_area_person.txt").import@t() // 读取文件数据(以文本为例)
=A1.select(dyear==y_date) // 根据年份参数过滤数据
=A2.groups(area;count(name):pnum,sum(amount):amount) // 按照地区分组汇总人数和销售额
=A3.select(amount>8000) // 选出销售额大于 8000 的记录
可以用 SPL 的脚本直接计算,如上图,也可以用 SQL 来计算,如下图

=connect() // 连接文件系统
=A1.query("select area,count(name) pnum,sum(amount) amount from order_year_area_person.txt where dyear=? group by area having sum(amount)>8000".y_date) // 执行标准 SQL 查询文本
SPL 具有完整的计算能力,高效又简单,文件存储数据不好计算的困扰就这么解决了
而且文件存储还易于管理,性能更好
文件存储易于管理
中间结果存到库外后,数据库就仅需要存储少量原始数据表就可以,数据库自身的管理压力就会变小,都转移到了库外文件上了
而库外的文件,就是普通的计算机文件,天然就便于管理,可以通过系统的树状目录进行存储,文件都跟着应用走,目录清晰,使用和管理都很方便,不会出现交叉引用相互耦合的情况,报表弃用或者应用下线,相应的中间存储文件就可以删除,再也没有想删不敢删的苦恼了
文件存储性能更好
文件系统更靠近底层,更接近磁盘,IO 性能本身就好于数据库
如果用 SPL 的二进制存储方式,效果会更明显,因为 SPL 的文件格式更紧凑,对于只读的中间数据,使用文件存储时不需要考虑再改写,可以更为紧致并采用一定的压缩手段,而且在访问时也不必考虑事务一致性,机制大为简化,这样就能获得更好的吞吐性能了