大清单报表怎么做才对

很多行业都会有展现明细数据类的大清单报表需求,比如电信行业月底要看本月的全部充值记录,银行业要看当月交易记录清单,数据量有时会达到百万甚至千万级别

imagepng

这么大的数据,如果等全部取出算完再呈现,需要很长时间,用户体验恶劣,另外,报表大都是内存计算,而服务器的内存是有限的,一次装不下这么多数据,不然就会溢出

所以,我们一般都会使用分页呈现的方式,尽量快速地呈现出第一页,然后再翻页显示后面的,每次只显示一页,也不会造成内存溢出

但这个方案虽然原理简单,做起来却不一定能做的好,做的对
大部分报表工具实现分页呈现,都是直接采用数据库的分页机制,也就是利用数据库提供的返回指定行号范围内记录的语法
这种做法有很多弊端!

数据库分页机制的弊端

比如:翻页效率差
页码小时 感觉不明显,页码较大时,会有明显的等待感。

还可能出现汇总错误
数据库分页,每页的 SQL 都是单独发送的,如果期间数据库发生增删操作,可能导致数据汇总错误。
这两个是最严重的问题!

另外还有其他的,比如无法实现分组效果
由于每页取数无法保证取出整组数据,需要分组的时候就做不了

无法使用非关系数据的数据源
数据库分页技术基本只适用于关系数据库,其他数据源,如 NOSQL 或文件则无法使用

而且程序代码和对应的数据库是强耦合的,万一换了数据源,那还得重新做一遍
所以直接用数据库的分页机制来做并不太好

更科学的方法

更好的方法应该是:把取数和呈现做现两个异步线程,取数线程发出 SQL 后就不断取出数据后缓存到本地存储中,呈现线程根据页数计算出行数到本地缓存中去获取数据显示

imagepng

这样就可以把前面提到的两个最大弊端从根本上解决掉了
1.首页秒级呈现,后面的页只要已经取过的数据也都能快速呈现,不会有等待感
2.取数线程也只涉及一句 SQL,在数据库中是同一个事务,就不会有不一致的问题

不过,目前的主流报表工具中,只有润乾报表采用了这个办法

imagepng

这顺便能把其他几个弊端也解决掉了
润乾的大报表引擎还可以方便做分组汇总,可以对接任意数据源,所以各类 NOSQL,文本等非关系数据源也可以做大报表了,而且处理逻辑在数据源外,报表如果切换了数据源,也依然可以通用,不需要重新再做一次

润乾的大报表做得非常专业,而且价格也很便宜,3W 就能买断随便用,妥妥的性价比之王,有大报表需求的同学,可以去试试了,润乾的技术支持小哥哥小姐姐会手把手支持到您上线哦