最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

报表性能优化方案之报表取数

[复制链接]
跳转到指定楼层
楼主
发表于 2015-9-21 10:53:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
1. 取数原理
设计器拼出最终的SQL,将SQL语句传给数据库,数据库执行,将数据返回给设计器。
由于计算过程首先要通过SQL语句从数据库中取数据,我们可以通过控制数据量的大小和对数据的提前预处理来提高报表的性能。下面是一些优化的方法。
2. 优化SQL
FineReport报表的数据集采用的是表模型,也就是说通过SQL这种DSL语言,从数据库通过简单查询或各种组合关联查询得到一个关系表,而这部分SQL查询根据各种数据库产商长时间的优化(比如建立索引),已经非常成熟。数据集一般要通过FineReport报表模型的复杂处理才能生成最终的表样。因此,从数据库SQL查询取出数据量越少,FineReport报表模型需要做的复杂处理和计算就越少,所花的时间和内存就少,从而可以提高性能。
2.1 SQL语句取具体的字段
我们一般会用select * from 这样的形式将一个数据库表中所有的字段都取出来,而其中一些字段是报表中不需要用到的,例如报表中只需要用到三个字段,但是数据库中实际的表有十个字段,一些初学者习惯性的用select * from table1,这样相当于把十个字段的数据都取到报表服务器端,增加了报表服务器端的内存占用以及减慢了运算速度,所以SQL语句中尽量不要用“*”号,而是写上具体的字段,能够减少报表服务器端的内存占用,加快报表的运算速度。
2.2 SQL中直接分组代替报表中分组
一些汇总类型的报表,例如制作一张订单总额的表,可能会从订单明细表中取出大量的数据记录,然后进行数据汇总,即进行分组聚集运算,报表计算过程中我们可以在SQL中提前进行一次分组聚集,能够大大减少取到的报表服务器的记录数,加快取数和报表运算的速度。
SQL语句:SELECT 成本价,类别ID FROM 产品
从数据库中选择如上两个字段,然后根据类别ID进行成本价的汇总,此时数据库返回给报表处理的数据就有77条。如下:


优化的SQL语句:SELECT sum(成本价),类别ID FROM 产品 group by 类别ID
经过SQL优化后,报表需要处理的数据就只剩8条了。如下:


优化分析:
第一种做法,不仅仅取到报表服务器上记录数多了,取数速度慢,而且报表模型需要对表数据列进行分组运算,增加了报表运行时间;
第二种做法,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快,且取到报表服务器端的记录数大大减少,取数速度大大加快,因此在报表模型进行分组运算的时候只要对很少的记录数进行,报表的运算速度大大加快了。
实验结果以及分析表明,第二种做法的性能远优于第一种。所以,分组应该尽量在sql里进行。
2.3 SQL中直接排序代替报表中排序
报表计算过程中很多时候需要对数据进行排序,虽然排序运算可以在报表端进行,不过我们还是建议在SQL中提前将数据排序,这是因为数据库中索引功能,通常是C/C++语言(往往在效率上比Java好)写的,会使得排序运算的速度很快。
2.4 SQL中直接过滤代替报表中过滤
报表计算过程中很多时候并不需要对表中的所有记录进行操作,而只是需要对部分满足条件的记录进行操作,虽然可以在报表设计器中对数据过滤,不过我们建议在SQL中对数据提前过滤,这样数据库返回的数据就减少了,既加快了取数速度,也加快了报表的运算速度。
3. 使用视图、存储过程
视图是由SELECT语句组成的查询定义的虚拟表,由一张或多张数据库实际的表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样。
存储过程通过流控制与SQL语句,可以对数据进行强大的运算与处理,对于业务比较复杂的应用,常常需要将原始数据通过存储过程处理后再供报表使用。另外存储过程运行前,数据库会对其进行语法和句法的分析,并进行优化,这种已经编译好的存储过程极大地改善SQL语句的性能。在报表端也只需要书写较短的调用语句来获得结果,从而降低网络的通信量。
所以表与表的连接、复杂的SQL尽量在数据库中使用视图或者存储过程直接进行,这样将复杂的SQL语句直接保存于数据库服务器端(数据库本身会对SQL语句进行语法分析并进行优化),在报表设计器端就不需要写大段的SQL语句而是直接调用视图或存储过程了,一方面减少网络传输量,减轻数据库的压力,另一方面加快了报表的运算速度。



楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-6-26 16:18

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表