有些报表查询出的数据行数可达千万甚至上亿,这类报表通常被叫做大报表,大多数情况下都是些清单明细数据报表,也有少量分组报表。
针对大报表,如果像常规报表一样,将数据一次性全取再交给前端呈现是不可行的。一是等待时间太长,用户体验差;二是很可能导致内存溢出造成应用崩溃。
那么,目前的报表产品是如何解决这一问题的呢?本文将调研并测试几款报表产品的大报表解决方案,还是针对这三款产品:润乾报表、帆软报表、Smartbi,均为最新版本。
首先了解下各家的解决方式或机制。
解决机制
帆软
帆软提供两种引擎,行式引擎专门解决明细大报表,新计算引擎可解决行式引擎及其不支持的一些情况(如某些数据库需手写分页 SQL 的问题、分组大报表、带汇总的分组报表等)。
行式引擎
实现原理是借助分页 SQL 按页取数,访问哪一页数据则取对应数据计算并呈现,所以也只能支持数据库源了。并且只有少部分数据库可以不改动 SQL 的情况下支持分页取数: Oracle,MySQL,HSQL 和 SQL Server 2012 及以上数据库。像其他的 access、SQL Server 2005 及 2008 等,必须手动编写分页 SQL 才能实现按页取数。可以看个例子感觉难易度:
原始 SQL:select * from 订单明细
SQL Server 2008 下的分页 SQL 为:
SELECT *
FROM (
SELECT TOP ${ if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcou