【数据蒋堂】功夫都在报表外--漫谈报表性能优化

简介:

应用系统中的报表,作为面向业务用户的窗口,其性能一直被高度关注。用户输入参数后都希望立即就能看到统计查询结果,等个十几二十秒还能接受,等到三五分钟的用户体验就非常恶劣了。

那么,报表为什么会慢,又应当从哪里入手进行性能调优呢?



数据准备


当前应用中的报表大都用报表工具开发,当报表响应太慢时,不明就里的用户就会把矛头指向使用报表工具的开发人员或者报表工具厂商。其实,大多数情况报表的慢只是个表现,背后的原因是数据准备太慢,在数据进入报表环节之前就已经慢了,这时再去优化报表开发或压迫报表工具并没有用处。


报表是给人看的,人类视力限制不可能查看过多数据,也就没有大数据的呈现需求。报表工具为了直观而采用的状态式计算模型,也不适合实现有复杂过程的计算。报表环节不应当也无能力解决大数据和复杂计算问题,只要处理小数据的摆位和简单计算,这不会耗用太多时间。


八成左右的报表慢是因为数据准备造成的。报表呈现的数据量虽然小,但涉及的原始数据量可能巨大,把大数据汇总和过滤成小数据需要很长时间;复杂计算也是类似,主要时间消耗在数据准备阶段。数据准备的优化是报表提速的关键。


1.优化数据准备代码:一般是SQL(或存储过程),某些时候是应用程序的代码(涉及非数据库或多数据库时);


2. 数据库扩容:数据量大,代码不能再优化时,还可以扩容数据库,比如采用集群方案;


3. 采用高性能计算引擎:传统数据库在实现某些运算时性能较差或成本太高,可以更换为其它计算机制;


报表计算


报表环节本身计算性能差的情况相对少,但也是有的。


一个典型的场景是多源关联报表,即把多个二维数据集按某个主键对齐呈现,有时可能还需要分组汇总。报表工具要求把计算都写进单元格,这样只能用数据集过滤来描述本格和其它数据集的关联,类似ds2.select(ID==ds1.ID)的表达式。这个运算复杂度是平方级的,在数据量不大时也无所谓,但数据量稍大(几千行)且涉及数据集较多时,性能就会急剧下降,从几秒到几十分钟都有可能。


如果我们把这个运算移到报表外,在数据准备阶段时处理,就可以大幅度提升性能。如果数据来自同一个数据库,那么用SQL写JOIN语句就可以了,如果数据集来自多库或者希望减轻数据库计算压力,也可以在外部实现HASH JOIN算法。HASH JOIN算法可以整体地看待几个数据集,效率比报表工具采用的过滤式关联要高得多,几千行规模时几乎是零等待。


报表计算性能差虽然发生在报表环节本身,但经常却要在报表外去解决。


其它类似场景还有,如带部分明细行的分组汇总表,表现出来是由于报表环节处理数据量大导致运算变慢,而解决方法也是把运算移到报表外。


数据传输


报表还有个慢的瓶颈在于数据传输。


目前很多应用都是J2EE架构的,采用的报表工具也是Java写的,这时访问数据库都要用JDBC接口。然而,某些常用数据库的JDBC驱动性能很差(这里就不点名了),取出数据量稍多(几万行)时就会有明显的等待感。这就导致一个无奈的现象:数据库压力很轻计算很快,报表端计算也不算复杂,但报表仍然很慢。


无论应用开发商还是报表工具厂商都没办法改变数据库的JDBC驱动,只能在外面想办法。经过多次实验,我们发现启用多线程并行取数就能获得数倍的性能(前提是数据库负担轻)。但是,目前还没有报表工具直接提供了并行取数的功能(由于数据分段方法和数据库及取数语法相关,需要代码控制,也不容易做成报表功能),这个方案仍然要在报表环节外的数据准备阶段来实施。


可控缓存


把近期访问过的报表缓存起来,短时间内再次访问同参数的报表时可以不必计算而直接返回,显然这能改善用户体验。很多报表工具也都提供有缓存功能,不过并不细致,缓存只能针对整个报表,而且各个报表的缓存是无关的。在报表外下点功夫可以实现控制力度更细致的缓存功能:


1.部分缓存。有些报表、特别是常见的多源报表,其中大部分数据相对稳定(历史数据),只有小部分数据时效性差(当期数据)。而整个报表的缓存的有效期只能以较短的为准,这样会导致报表经常被重算。如果能只缓存部分数据,就能延长这部分缓存的生命期,从而减少计算量。


2. 缓存复用。不同的报表可能引用到同样的数据,而互相无关的报表缓存机制则会迫使这些报表多次重复计算同样的数据。如果能让某个报表引用到其它报表已经计算出来的缓存数据,也能有效减少计算量。


这些复杂的缓存控制需要编写代码来实现,不容易在报表工具中提供,但在可编程的数据准备阶段实施却相对容易。


清单列表

前面说过,报表和大数据的直接关系并不大。甚至可以说老是喊大数据报表的厂商多半是忽悠。


不过有一种清单列表确实是大数据报表。清单列表在金融行业经常碰到,把一段时间的交易清单列出来。其特点是数据量特别大,可能会有几千上万页,不过计算会相对简单,经常只是罗列,最多有些按页按组的汇总。


报表工具为了处理灵活的格间运算,一般都会采用全内存方式。这样,把清单列表加载进报表工具时,会大概率出现内存溢出;而且太大数据量全部取出并加载也需要很长时间,用户难以容忍。


容易想到的办法是边读取边呈现,每次只呈现一页,不会溢出;读满一页后立即呈现,用户不会有太强的等待感。数据库都提供有游标可以逐步读出数据,但用户可能在前端翻页,这还需要高速随机按页(行)取数的能力。数据库就没有这种接口了,用条件过滤取数不仅很慢,而且还由于数据可能仍在更新而不能保证报表在生命周期内的数据一致性。


结果还是要在数据准备阶段解决。两个异步线程:一个负责从数据库取数并缓存到外存(假定数据量大内存装不下),另一个接受前端请求从缓存中按页(行)取出数据返回。



专栏作者简介


蒋步星,润乾软件创始人、首席科学家

清华大学计算机硕士,著有《非线性报表模型原理》等,1989年,中国首个国际奥林匹克数学竞赛团体冠军成员,个人金牌;2000年,创立润乾公司;2004年,首次在润乾报表中提出非线性报表模型,完美解决了中国式复杂报表制表难题,目前该模型已经成为报表行业的标准;2014年,经过7年开发,润乾软件发布不依赖关系代数模型的计算引擎——集算器,有效地提高了复杂结构化大数据计算的开发和运算效率;2015年,润乾软件被福布斯中文网站评为“2015福布斯中国非上市潜力企业100强”;2016年,荣获中国电子信息产业发展研究院评选的“2016年中国软件和信息服务业十大领军人物”;2017年, 自主创新研发新一代的数据仓库、云数据库等产品即将面世。


数据蒋堂

《数据蒋堂》的作者蒋步星,从事信息系统建设和数据处理长达20多年的时间。他丰富的工程经验与深厚的理论功底相互融合、创新思想与传统观念的相互碰撞,虚拟与现实的相互交织,产生出了一篇篇的沥血之作。此连载的内容涉及从数据呈现、采集到加工计算再到存储以及挖掘等各个方面。大可观数据世界之远景、小可看技术疑难之细节。针对数据领域一些技术难点,站在研发人员的角度从浅入深,进行全方位、360度无死角深度剖析;对于一些业内观点,站在技术人员角度阐述自己的思考和理解。蒋步星还会对大数据的发展,站在业内专家角度给予预测和推断。静下心来认真研读你会发现,《数据蒋堂》的文章,有的会让用户避免重复前人走过的弯路,有的会让攻城狮面对扎心的难题茅塞顿开,有的会为初入行业的读者提供一把开启数据世界的钥匙,有的甚至会让业内专家大跌眼镜,产生思想交锋。


原文发布时间为:2017-04-21 

本文作者:蒋步星

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
网络协议 Unix Linux
有了协程库,开发DPDK应用程序第一次可以这么简单
使用PhotonLibOS协程库,以多执行单元并发的代码模型代替原先的异步回调模型,简化DPDK应用程序的开发。同时使用echo server验证了 用户态TCP/IP协议栈+轮询模式驱动 对比 内核原生协议栈+中断模式驱动 的性能优势
10964 0
有了协程库,开发DPDK应用程序第一次可以这么简单
|
8月前
|
存储 弹性计算 API
阿里云服务器带宽值多大合适?公网带宽多少M够用?
阿里云服务器带宽选择需根据实际场景:轻量应用选1-5M,中小型网站/API建议5-20M,视频、大文件下载等高并发业务建议50M以上。可结合CDN、OSS、弹性公网EIP和共享带宽降低成本,提升性能。
1390 155
|
6月前
|
应用服务中间件 Shell nginx
我的docker学习笔记
本指南系统讲解Docker核心实践:涵盖安装配置、镜像获取与管理、容器生命周期操作(启停/日志/进入/导入导出)、数据卷与Bind Mount数据持久化、网络配置(Bridge/自定义网络/DNS)、Dockerfile定制镜像(COPY/ADD/CMD/ENTRYPOINT/ENV/ARG/VOLUME等指令详解)及Docker Compose编排应用。内容实用,步骤清晰,适合快速上手与深入实践。(239字)
488 6
|
7月前
|
JavaScript 前端开发 小程序
Vue为何能稳居前端框架主流宝座
自2014年发布以来,Vue凭借“低门槛、渐进式、生态完善、持续进化”四大优势,迅速跻身前端主流框架。其简洁的模板语法降低学习成本,灵活架构适配各类项目,官方生态与活跃社区提升开发效率,Vue3性能升级与跨平台能力更支撑大厂核心业务,成为中小企业与头部企业共同选择,地位日益稳固。
367 0
|
消息中间件 存储 缓存
QPS多少,才算高并发 ?
本文详解高并发概念及 QPS 标准,大厂面试高频点,建议掌握收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
QPS多少,才算高并发 ?
|
PyTorch 算法框架/工具 计算机视觉
零基础入门语义分割-地表建筑物识别 Task4 评价函数与损失函数 -学习笔记
零基础入门语义分割-地表建筑物识别 Task4 评价函数与损失函数 -学习笔记
559 0
|
人工智能 缓存 自然语言处理
阿里云 × 天润融通:基于智能体的企业营销与客户服务实践分享
本次分享由阿里云与天润融通联合呈现,主题为“基于智能体的企业营销与客户服务实践”。主讲人安静波(北京天润融通科技股份有限公司CTO)将介绍天润融通的智能体平台架构及其在企业营销和客服场景中的应用。内容涵盖天润融通的发展历程、基于阿里云的AICC架构、智能体平台的技术细节及优化实践,并通过客户案例展示如何通过智能体提升营销转化率和客户满意度。重点探讨了智能体在实时响应、打断处理等方面的优化措施,以及大模型的应用经验。
1329 0
|
设计模式 开发框架 Java
分清 PO、VO、DAO、BO、DTO、POJO 含义
分清 PO、VO、DAO、BO、DTO、POJO 含义
1681 1
|
人工智能 供应链 搜索推荐
3D打印:从原型制作到制造业的颠覆性变革
【9月更文挑战第14天】3D打印技术以其独特的增材制造方式,在材料、工艺、设备等方面取得显著进步,从原型制作跨越至直接生产,推动制造业转型升级。它加速了设计与创新,使复杂结构成为可能;按需制造特性颠覆了生产模式,降低了库存成本,提高了市场响应速度;同时催生了新的商业模式,如定制化服务和平台运营。尽管面临材料成本和技术成熟度等挑战,但3D打印技术正逐步普及,未来将在智能化和网络化方向上持续发展,引领制造业迈向更高效、定制化的未来。
|
人工智能 算法
直接使用大模型面临的问题
【1月更文挑战第20天】直接使用大模型面临的问题
1429 4
直接使用大模型面临的问题