报表性能是总也避不开的话题,报表作为 OLAP(在线联机分析)中的主要应用场景,无论从涉及数据的宽度(表数量),还是数据的广度(查询范围)都可能非常巨大;而且在报表中还经常伴随非常复杂的数据处理逻辑,这些都会影响报表的运行速度。而服务器环境、数据库环境、JDBC 效率、网络环境、客户端环境这些也都都跟报表性能密切相关。
报表性能可能跟很多因素有关,非常复杂。这里我们试着从报表运行的各个阶段来分析报表性能问题产生的主要原因及其应对方法。未尽之处,欢迎讨论。
我们知道报表运行主要分报表解析、数据准备、数据传输、报表计算和报表生成 5 个阶段。除了报表解析是引擎加载解析模板,还未开始运算外,其他 4 个阶段(示意图中黄色的部分)均可能引起性能问题。
我们在分析报表性能问题时一定要先定位是哪个阶段引起的,抓主要矛盾。定位的方法也很简单,就是分析报表运行日志,很多报表工具都会输出各个阶段的运算时间,看看哪个阶段耗时最长,就是问题发生的主要阶段了。
1. 数据准备
报表数据准备是指从数据源中读取数据并将数据组织成报表可用的结果集的过程。在报表中往往是以数据集的形式存在,可以通过 SQL、存储过程或 JAVA 实现。
数据准备并不是简单地将数据源的原始数据取出就结束了,而是会伴随一些计算过程,有些还很复杂,可以想想