润乾报表教程-集算报表优化计算过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了润乾报表教程-集算报表优化计算过程相关的知识,希望对你有一定的参考价值。

报表作为数据统计分析软件,当它出现性能问题需要对数据源计算进行优化时,执行路径难以控制是阻碍报表优化的难题之一。这是由于数据库执行路径不透明,程序员很难甚至无法干预执行路径,也就难以提高数据库的性能。而一般报表工具不具备强计算能力,大部分计算仍然要依靠数据库进行,这就导致很多报表优化效果不理想。

不同于一般报表工具,润乾集算报表内置了专门用于数据计算的集算引擎,开发人员可以通过编写集算脚本完成报表数据源准备。与数据库执行SQL路径不可控相比,集算脚本的执行过程是可控的,开发人员可根据实际情况编写或更改计算执行过程,从而完成报表优化工作。

集算引擎内置了丰富的结构化数据计算的类库,如连接操作就包括普通连接join()、按序号对应连接的pjoin()、叉乘连接的xjoin(),针对维表和事实表提供了更加高效的连接方式switch(),这样就为开发人员在优化报表时提供了多种选择。此外,由于集算报表支持分步编写,开发人员可以自由决定计算顺序,先算什么后算什么,甚至对一个复杂计算进行合理拆分和整合,适合通过改变计算顺序来进行优化的场景。

下面是一个针对报表SQL数据源优化的实例过程和效果,用户在使用集算报表时可以参考。

该报表是一张明细表,数据量较大,涉及到的数据库表有几十个之多,数据库表间关联频繁(包括自连接的情况);报表中包含多个格间计算表达式(比值和汇总值)。

其中较复杂的数据集SQL(近400行)如下:

select t.*

  from (select *

          from (select syb.org_abbreviation as syb,

                       max(xmb.org_abbreviation) as xmb,

                  --省略多个连接、判断、汇总语句

                  left join losrrr losr on losr.requisition_id =

                  l.requisition_id

                 where l.table_type = ‘1‘

                   and l.requisition_state = ‘0100500005000000006‘

                   and nvl(l.bsflag, 0) != 1

                 group by l.requisition_id,

                          l.note,

                          --省略多个分组字段

                          losr.standby_param3,

                          losr.standby_param6

                ) a

          LEFT JOIN crview ve  --视图

            ON ve.requisition_id = a.req_id

仔细看这个sql会发现,首先关联的表比较多,其中包括很多自关联的情况;嵌套了很多子查询;最后又与一个视图进行关联(视图复杂程度与上述SQL类似)。该报表查询4个月数据展现时间6分42秒,远远达不到用户要求。由于SQL比较复杂,数据库执行路径难以控制,所以很难在SQL的层面再进行优化。

 

使用集算报表进行优化的过程如下:

1、编写集算脚本

首先,拆分原报表数据集SQL。这个SQL慢的原因在于两个子查询之间的join,那么分别把两个子查询sql写到集算脚本中执行,并且在集算脚本中使用switch完成关联。

技术分享 

 

其次,消除报表格间运算。将原报表模板中的格间计算(比值和汇总值)的内容全部移到集算脚本中完成,这样报表少了格子遍历的过程,可以提升性能。

技术分享 

 

最后,将结果集一次返回给报表。通过集算脚本完成了所有数据准备的工作后,将结果一次性返回给报表工具,报表接收到数据源后直接进行展现(不再做其他如格间计算类的影响效率的计算)。

技术分享 

 

完整的集算脚本如下:

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享


2、在集算报表中调用上述集算脚本,编辑报表表达式完成报表制作。

 

优化效果

报表展现要经历的两步:1数据源计算(执行数据集SQL)阶段,2 报表计算并展现阶段,报表优化前后各阶段与总时间对比见下表:


数据集计算

报表计算展现

总时间

优化前

317s

85s

402s

优化后

52s

5s

57s

通过上面的过程,该报表展现时间从原来的6分42秒,锐降到了57秒,不到1分钟的时间,达到了用户预期的目标。

 

集算报表对不同的场景都有相应的优化方案,上述计算过程的优化适用于数据库取出数据量不是很大的场景(由于Oracle JDBC速度非常慢)。如果数据量很大,可以使用集算报表的大数据集功能,请参考后续文章。

 

 


以上是关于润乾报表教程-集算报表优化计算过程的主要内容,如果未能解决你的问题,请参考以下文章

润乾集算报表的脚本数据集

润乾报表 动态改变数据源

多层次报表的性能优化方案

润乾报表大数据量展现报错内存溢出怎么办呀?

乾润乾报表服务器怎么计算两个单元格之间的除法

润乾报表的附件上传?