实战教学--怎样提高报表呈现的性能?

报表的性能很重要,是一个总被谈及的问题,跑的慢的报表用户体验恶劣,无法忍受。解决这些慢的性能问题,也成了项目方和工程师头疼的事情。一出状况,就得安排技术好的,能力强的工程师去救火,本来利润就薄,还得不断的追加人工成本,而且工程师有时候也无能为力,并不是所有的性能问题都能靠程序员能力解决的

这个总会让人头疼的问题没办法解决吗?没有好的方法去提升性能了吗?

解决这个问题之前,我们得先理清楚问题的根源,是什么导致了报表的性能问题,找到根源,我们才能对症下药,才能治本

报表性能问题出在什么环节?

报表的呈现周期中,大致可以分为下图的4个环节,4个环节都有可能造成报表的性能问题,但概率较高的是前两个环节,数据准备和数据传输(图中黄色电池电量图,代表了出问题的程度)

imagepng

所以解决报表的性能问题,就得首先重点看前两个环节,虽然说这俩环节严格意义上讲其实并不属于报表的功能范畴,而是数据源本身的问题,但是用户不会去管,也分不清楚是谁的原因导致报表慢的,所以不管是实施方还是报表工具本身,得在这两方面有优化的能力才能解决这俩问题

数据准备的问题和优化

报表中展现的数据大部分情况下并不是从数据来源中直接取就可以,大都需要经过计算处理加工,准备好以后,才能被报表工具来使用

这些数据准备,多数是用SQL或存储过程来做的,一些涉及库外数据来源和计算的,可能会用其他的高级语言去处理

当这个过程出现性能问题时,首先要做的是去优化这些数据准备的代码,比如优化SQL或存储过程,完成同样运算的SQL可能有不同的写法,有可能会有相当大的性能差异(比如把EXISTS换成JOIN就能快得多)。

但仍然有不少时候,即使SQL已经做了几轮优化,性能仍然起不来,这时候通常就要考虑升级硬件了,扩容数据库做集群或者升级服务器配置等,不过这又会带来额外高昂的成本

还有个办法是使用开源的SPL来替代SQL做数据准备

上面说到的,有时候经过多轮优化的SQL仍然跑不快,这是因为SQL本身有局限性,缺乏很多数据类型和基础运算,很多高性能算法都无法描述,结果只能使用较慢的算法,用了这么多年,虽然很多数据库和大数据平台都在工程上对这些慢的算法有所优化,但也只能针对简单的场景,情况复杂之后数据库的优化器依旧会“晕”掉,并没有从根本上解决SQL局限性的问题

而SPL是一种拥有全新高效算法的计算语言,可以从根本上解决各类SQL局限性导致的性能难题

我们通过一个简单小例来看一下SPL比SQL的算法高效在哪里

比如要在 1 亿条数据中取出前 10 名,用SQL算就会涉及大排序,大排序就会影响性能, 其实我们是可以想出不用大排序的算法的,但SQL无法描述,那就只能指望数据库优化器了,简单情况下,很多商用数据库确实都能优化,使用不必大排序的算法,性能通常也很好,但情况稍微变复杂一些,比如要在每个分组中取前 10 名,要用到窗口函数和子查询,这时候优化器就又无能为力了,又得乖乖去大排序,慢慢的算了

SPL则不然,SPL离散数据集中有普遍集合的概念,TopN 这种运算被认为是和 SUM 和 COUNT 一样的聚合运算,只不过返回值是个集合,用SPL去做个这个计算的时候就不需要做大排序了

有了这样更高效的算法,那速度自然就快了,性能自然也就好了

除了新的高效的算法以外,数据的存储对于性能也非常重要,好算法要有合适的存储机制配合才能生效,SPL也有自己更高效的存储方式,高性能二进制文件存储,相对于普通的数据库存储,SPL的二进制存储和SPL的高效算法配合,性能会更好,使用SPL存储后,可以把原来需要缓存的计算过程变成不需要了,原来要遍历多遍的运算变成只遍历一次甚至不用遍历了,减少硬盘访问量也是非常有效的性能提升手段

imagepng

报表涉及的数据,基本都是历史数据,必要的时候,把这些数据换一种更高效的方式存储,可行性也是很大的

下面是几个用SPL来优化数据准备的实际案例,有需要的可以详细看一下

开源 SPL 提速保险公司团保明细单查询 2000+ 倍

开源 SPL 提速银行资金头寸报表 20+ 倍

开源 SPL 提速银行 POS 机交易报表 30+ 倍

开源 SPL 提速资产负债表 60 倍

通过这些实际案例可以看出,使用SPL实现了高效的算法后,在SQL无法解决的性能问题中,可能获得数倍以至数十甚至上百倍的性能提升

到这里我们可能会想,解决个性能问题还得把原先的SQL甚至是存储方式都舍弃,全部用新的SPL重新做,这也太费劲了,代价太大了吧

是的,小问题是没这个必要折腾,但是遇上重病那就只能用猛药来医了,当现有的SQL已经无法再继续优化,性能问题已经没办法解决时,那就只能尝试用新的办法来解决了

而且体会过更高效的算法以后,使用新技术估计也不会再是一种迫不得已的选择了,而是会变成更主动自愿的拥抱了

另外一些报表工具已经集成了开源的SPL了,比如润乾报表,直接用这样的工具来做报表,解决起问题来也更直接方便一些

数据传输的问题和优化

报表项目大部分都是JAVA应用,基本都得通过JDBC来取数、做数据传输,有时候我们会发现,SQL很简单,数据库负担也很轻,但数据传输到报表却需要很长时间,传输完成后,报表也算的很快,那就可以判定,就是有些数据库的JDBC取数太慢,导致了性能问题

这是DB本身的问题,怎么优化?

我们动不了厂商的JDBC,那就只能曲线救国,单线程取的慢,如果数据库允许,我们可以尝试多线程并行取,如果报表工具有并行取数的功能,那问题就迎刃而解了,但由于并行取数涉及的数据分段方法和数据库及取数语法需要较复杂代码控制,也不容易做成报表功能,所以目前的报表工具基本都不支持并行取数,那就又得再外围实现了

外围实现,可以是自己用java等高级语言去写,但是会复杂一些,工作量也不小,也可以用现成的计算工具去做,比如前面提到的SPL就可以轻松支持并行计算,下图就是SPL并行取数的代码,写起来还是很简单的,也容易理解

imagepng

在数据库负担不重时,并行取数几乎可以让传输效率得到线性的提升

附上一个并行取数和单线程取数的性能测试对比,感兴趣的同学可以去看看

JDBC 取数到底有多慢

同样的,如果报表工具中集成了SPL,那也就可以通过并行取数来提升性能了

imagepng

其他环节的问题和优化

报表内计算和呈现

前两个重点的环节看完了,大头已经解决了,不过还是有些报表的性能问题出在后面的环节中,我们来看下,后两个环节是报表内的计算和呈现

先看计算

报表内的计算,首先要看报表工具的基本功,另一方面也要看外围计算引擎,基本功好,可以保证大部分表内计算都不出问题,有外部计算引擎,可以保证特殊情况也运行无恙

我们以业界性能口碑比较好的润乾报表为例,即使它在相同条件下各类报表,各种计算的性能都优于同类产品,但由于报表工具本身定位的局限性,再好的工具也不可能任何情况下都跑的快,遇到跑不快的情况,工具本身没有优化空间时,那就还得借助外部计算引擎的能力才行

举个最简单的例子,比如要在报表里做多源关联,我们需要写一个类似这样的表达式ds2.select(ID==ds1.ID),表达式很简单,但是计算复杂度却是平方级的,数据量不大时,都没问题,数据量稍大时,到几千行,那性能就会急剧下降了,再好的工具处理这样的运算也会有问题

但如果把这个关联放到报表外来做,利用外部的计算引擎计算能力,可以使用低复杂的HASH算法(而在报表工具中无法对多个数据源先统一处理,实现不了这种算法),那性能就会大幅度的提升了

以下是我们在数据量比较大时,用润乾报表单独运算和SPL+润乾报表协同运算的性能对比,可以看出,报表内的计算性能问题,如果挪到外部计算引擎解决,效果是非常好的

imagepng

(蓝色是润乾报表单独运算的时间,橙色是SPL+润乾报表协同运算的时间)

再看呈现

这个就完全看报表本身的能力了,没有其他外围方式可以协助和利用了,如果呈现环节总出问题,那就得考虑换工具了

附上一个如何考察报表工具本身计算和呈现性能的帖子,有需要的可以参考:

怎样评测对比报表工具的性能?

大报表

报表性能问题们还有一个场景需要注意,就是大清单式报表,比如电信行业,要查看当月所有的充值记录,这样的报表,格式简单,但是数据量极大,有的可达到千万级以上,这类大数据量的报表呈现时如果等着把这些记录全部检索出来再生成报表,那会需要很长时间,用户体验自然会非常恶劣,而且报表一般采用内存运算机制,大多数情况下内存里也装不下这么多数据,所以我们一般都会使用分页呈现的方式,尽量快速地呈现出第一页,之后再通过翻页来加载后面的

这种分页呈现的方式通常是利用数据库的分页机制来实现,但数据库分页不仅有如下这些弊端,而且程序代码和对应的数据库是强耦合的,万一换了数据源,那还得重新做一遍

更好的方式是,取数和呈现做成两个异步线程,取数线程发出 SQL 后就不断取出数据后缓存到本地存储中,呈现线程根据页数计算出行数到本地缓存中去获取数据显示,如下图所示

通过这样的方式,就可以很好的解决大数据量清单式报表的性能难题了具体如何实现可以参考:大清单报表该怎么做?

总结

从前面所述的几个优化过程中可以看出,大部分性能问题,都是在报表工具外做的优化,数据准备在报表外,数据传输在报表外,表内计算慢时,大部分也可以挪到报表外,只有呈现这一个环节是报表内的

所以单凭一个报表工具想完全解决报表的性能问题是不太可能的,要真正彻底的解决性能难题,除了看报表本身的性能外,更需要重点看工具有没有外围的计算引擎来协助,报表本身能力强,又有计算引擎帮忙(类似内置了开源SPL的润乾报表),一套组合拳打下来,报表性能问题才能真正解决

如果报表工具本身性能就很普通,还没有其他计算引擎辅助,那是谁也不可能把老爷车的发动机优化到F1赛车的马力的

润乾报表资料

  • 润乾报表官网

  • 润乾报表下载

欢迎对报表有兴趣的加小助手VX号RUNQIAN_RAQSOFT,进技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WiFi共享精灵 - 不需路由器一键轻松把网线共享给手机、笔记本等同时无线上网...

现在人们身边手机、游戏机等各种使用WiFi上网的设备已经越来越多,但经常遇到一些地方只有有线网络,或者没有无线路由器的情况,这时,用笔记本上网,然后把网络通过WiFi共享给其他设备上网那么就最合适了。我们之前有介绍…

干货|李开复最新刷屏演讲:人工智能最难取代这13种工作,也最容易威胁人性与爱!...

来源:澎湃新闻这两年,创新工场董事长兼首席执行官李开复,一直为人工智能站台和奔走,还出新书帮助人们规划未来的AI生活。他预言,中国有望在全球范围内首先实现OMO(Online-Merge-Offline,线上线下…

Apifox vs Eolink,国内 Api 工具哪家强?

目前行业内有 postman、jmeter 为代表开源 Api 工具派系,我想对大家对这两个词并不陌生。虽然它们能解决基本的接口测试,但是无法解决接口链路上的所有问题,一个工具难以支持整个过程。 在国内,我们可以看到有国产 API 管理工具&…

人工智能、区块链、混合现实:2019年新闻、媒体与技术趋势

来源:资本实验室近日,未来今日研究所(Future Today Institute)发布了《2019年新闻、媒体与技术趋势报告》,报告提出了涵盖多个领域的108个新兴技术趋势。报告显示,未来的新闻、媒体等行业将受到各种技术错综…

活久见:都 2203 年了,你还在使用 word 调试 API

随着信息技术的发展,API 变得无处不在,无处不用。但令人费解的是,都 2203 年了,竟然还有很多人使用 word 调试 API? 今天,西红柿将带领大家打开新世界的大门,放下诺基亚,抄起智能机&…

Struts2基础知识

本文主要包括以下内容 struts2常用常量的定义与意义struts2处理流程拆分struts动态方法调用,使用通配符接收请求参数中文编码问题自定义类型转化器访问或添加request/session/application常用servlet对象的获取 struts2常用常量的定义与意义 struts2处理流程 每一次请求都会创…

自动驾驶汽车测试在美惹争议,原因为何?

来源:中国汽车报摘要:近日,针对美国总统特朗普提出的,汽车制造商需自愿提交他们在公共道路上测试自动驾驶汽车安全报告一事,回应者寥寥,目前只有三家汽车公司响应了上述要求,提交了相关材料。据…

Struts2基础知识(二)

本文主要包括以下内容 文件上传&#xff0c;多文件上传 自定义拦截器 用户输入验证国际化 文件上传 将头设置为enctype”multipart/form-data” <body><form action"${pageContext.request.contextPath}/upload/upload1.action" method"post" …

想做自动驾驶技术的入,这回分享一个简单好用的开放平台

前言 自动驾驶已经是现在技术开发领域最热门的方向之一&#xff0c;作为程序员&#xff0c;很多人也都想来这个领域试试水。但是这个领域的门槛也挺高&#xff0c;不过想开始的话&#xff0c;其实可以从一些专门针对自动驾驶的开放平台开始入手&#xff0c;目前比较主流的可以…

潘建伟团队再登Nature:全球首次实现器件无关量子随机数,量子保密通信安全再升级...

岳排槐 编辑量子位 出品 | 公众号 QbitAI据消息&#xff0c;潘建伟团队日前成功实现了器件无关的量子随机数&#xff0c;将在数值模拟、密码学等领域广泛应用&#xff0c;并有望形成新的随机数国际标准。相关研究成果于北京时间20日由国际权威学术期刊《自然》在线发表&#xf…

一篇文章搞懂数据仓库:数据治理(目的、方法、流程)

目录 1、什么是数据治理 2、数据治理的目的 3、数据治理的方法 4、数据质量8个衡量标准 5、数据治理流程 1、什么是数据治理 数据治理&#xff08;Data Governance&#xff09;是组织中涉及数据使用的一整套管理行为。由企业数据治理部门发起并推行&#xff0c;关于如何制…

在OEL5上安装配置Oracle Gird Control 10.2.0.5

早期的Grid Control问题实在太多了&#xff0c;以至于把10.2.0.1的Grid Control升级到10.2.0.5几乎是不可能完成的任务&#xff1b;此外10.2.0.5以前的gc不支持11g作为repository database仓库数据库&#xff0c;不仅于此10.2.0.1版本是不支持rhel5或OEL5的&#xff0c;如果想安…

Struts2基础知识(三)

本文主要包括以下内容 OGNL表达式标签 防止表单重复提交 使用第三方插件tomcat启动时struts2容器做的事 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写&#xff0c;它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言。 相对EL表达…

70行Python代码,获取中国数据库大会(DTCC)全部PPT

大家好&#xff0c;我是明月十四桥&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 学会使用python 获取各种网站的ppt&#xff0c;可见即可爬&#xff1b; ② 中国数据库大会一年一届&#xff0c;门票昂贵&#xff0c;干货…

半导体产业格局:行稳而致远,强者将恒强

来源&#xff1a;华泰证券▌中国半导体产业链渐趋完善&#xff0c;产业生态体系逐步成形目前我国垂直分工模式的芯片产业链初步搭建成形&#xff0c;产业上中下游已然打通&#xff0c;涌现出一批实力较强的代表性本土企业。集成电路是基础性、先导性产业&#xff0c;涉及国家信…

Struts2之Crud综合实例

本文是Struts2的综合实例&#xff0c;主要包含以下功能 添加&#xff0c;删除&#xff0c;修改&#xff0c;查询用户上传&#xff0c;下载图片 拦截器实现登陆功能 验证器检查输入 下载图片功能以前没有实现过&#xff0c;步骤如下 在类中增加两个属性 //文件下载private…

教你用python爬英雄联盟官网:①掌握爬虫技术;②Python数据可视化

大家好&#xff0c;我是明月十四桥&#xff01;&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 掌握爬虫技术&#xff0c;体会python爬虫流程&#xff0c;可见即可爬&#xff1b; ② 学会使用python数据可视化。 有问题的…

7套干货,Python常用技术学习知识图谱!!(史上最全,建议收藏)

大家好&#xff0c;我是明月十四桥&#xff01; 你要偷偷努力&#xff0c;然后惊艳所有人~ 给大家推荐 7 个宝藏级教程&#xff0c;视频课是永久有效的&#xff0c;可以随时学习&#xff0c;有几门课程还有CSDN官方学习答疑群&#xff0c;课程右边扫码入群&#xff0c;讲师在群…

权威发布 |《科学美国人》:2018全球十大新兴技术

来源&#xff1a;世界经济论坛摘要&#xff1a;尽管这些技术仍处于发展早期&#xff0c;但它们吸引了众多研究团队的关注&#xff0c;并且广受投资者青睐。在未来3~5年间&#xff0c;它们可能会对社会与经济产生重要影响。9月19日&#xff0c;《科学美国人》与世界经济论坛&…

23篇大数据系列(一)java基础知识全集(2万字干货,建议收藏)

大数据系列爽文&#xff0c;从技术能力、业务基础、分析思维三大板块来呈现&#xff0c;你将收获&#xff1a; ❖ 提升自信心&#xff0c;自如应对面试&#xff0c;顺利拿到实习岗位或offer&#xff1b; ❖ 掌握大数据的基础知识&#xff0c;与其他同事沟通无障碍&#xff1b; …