知方号

知方号

[FineReport帆软]优化报表取数<帆软报表函数>

[FineReport帆软]优化报表取数

1. 描述

报表的核心是数据,数据集是否合理决定报表的质量。     

1.每张报表都应该有一个主数据集,为了降低维护时的工作量,尽量将所有字段置于主数据集,除非在某些情况下,不使用多源数据集会导致主数据集异常复杂。

2.在制作报表之前,尽量考虑到所有需要展示的数据字段,在数据库软件中,合理编写 SQL 语句,大数据情况尽量对 SQL 做优化,以及添加索引。

2. 取数原理

设计器拼出最终的 SQL,将 SQL 语句传给数据库,数据库执行,将数据返回给设计器。

由于计算过程首先要通过 SQL 语句从数据库中取数据,我们可以通过控制数据量的大小和对数据的提前预处理来提高报表的性能。

3. 优化 SQL

FineReport 报表的数据集采用的是表模型,也就是说通过 SQL 这种 DSL 语言,从数据库通过简单查询或各种组合关联查询得到一个关系表,而这部分 SQL 查询根据各种数据库厂商长时间的优化(比如建立索引),已经非常成熟。数据集一般要通过FineReport报表模型的复杂处理才能生成最终的表样。因此,从数据库 SQL 查询取出数据量越少,FineReport 报表模型需要做的复杂处理和计算就越少,所花的时间和内存就少,从而可以提高性能。

3.1 SQL 语句取具体的字段

我们一般会用select * from 这样的形式将一个数据库表中所有的字段都取出来,而其中一些字段是报表中不需要用到的,例如报表中只需要用到三个字段,但是数据库中实际的表有十个字段,一些初学者习惯性的用select * from table1,这样相当于把十个字段的数据都取到报表服务器端,增加了报表服务器端的内存占用以及减慢了运算速度,所以 SQL 语句中尽量不要用“*”号,而是写上具体的字段,能够减少报表服务器端的内存占用,加快报表的运算速度。

3.2 SQL 中直接分组代替报表中分组

一些汇总类型的报表,例如制作一张订单总额的表,可能会从订单明细表中取出大量的数据记录,然后进行数据汇总,即进行分组聚集运算,报表计算过程中我们可以在 SQL 中提前进行一次分组聚集,能够大大减少取到的报表服务器的记录数,加快取数和报表运算的速度。

SQL 语句:SELECT 成本价,类别ID FROM 产品

从数据库中选择如上两个字段,然后根据类别 ID 进行成本价的汇总,此时数据库返回给报表处理的数据就有 76 条。如下:

优化的 SQL 语句:SELECT sum(成本价),类别ID FROM 产品 group by 类别ID

经过 SQL 优化后,报表需要处理的数据就只剩 8 条了。如下:

优化分析:

第一种做法,不仅仅取到报表服务器上记录数多了,取数速度慢,而且报表模型需要对表数据列进行分组运算,增加了报表运行时间;

第二种做法,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快,且取到报表服务器端的记录数大大减少,取数速度大大加快,因此在报表模型进行分组运算的时候只要对很少的记录数进行,报表的运算速度大大加快了。

实验结果以及分析表明,第二种做法的性能远优于第一种。所以,分组应该尽量在 SQL 里进行。

3.3 SQL 中直接排序代替报表中排序

报表计算过程中很多时候需要对数据进行排序,虽然排序运算可以在报表端进行,不过我们还是建议在 SQL 中提前将数据排序,这是因为数据库中的索引功能,通常是 C/C++ 语言(往往在效率上比 Java 好)写的,会使得排序运算的速度更快。

3.4 SQL 中直接过滤代替报表中过滤

报表计算过程中很多时候并不需要对表中的所有记录进行操作,而只是需要对部分满足条件的记录进行操作,虽然可以在报表设计器中对数据过滤,不过我们建议在 SQL 中对数据提前过滤,这样数据库返回的数据就减少了,既加快了取数速度,也加快了报表的运算速度。

4. 使用视图、存储过程

视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

存储过程通过流控制与 SQL 语句,可以对数据进行强大的运算与处理,对于业务比较复杂的应用,常常需要将原始数据通过存储过程处理后再供报表使用。另外存储过程运行前,数据库会对其进行语法和句法的分析,并进行优化,这种已经编译好的存储过程极大地改善 SQL 语句的性能。在报表端也只需要书写较短的调用语句来获得结果,从而降低网络的通信量。

所以表与表的连接、复杂的SQL尽量在数据库中使用视图或者存储过程直接进行,这样将复杂的 SQL 语句直接保存于数据库服务器端(数据库本身会对 SQL 语句进行语法分析并进行优化),在报表设计器端就不需要写大段的 SQL 语句而是直接调用视图或存储过程了,一方面减少网络传输量,减轻数据库的压力,另一方面加快了报表的运算速度。

 

5. 优化示例

5.1 SELECT 子句中避免使用 “*”  

 

当你想在 SELECT 子句中列出所有的 columns 时,使用动态 SQL 列引用‘*’是一个方便的方法。不幸的是,这是一个非常低效的方法。 实际上,ORACLE 在解析的过程中, 会将“*” 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了