当前位置:首页 > 公众号精选 > 技术让梦想更伟大
[导读]问题描述C保险公司业务系统中,团体保险明细查询速度很慢。查询时输入保单号,要返回团体保单包含的所有被保险人的信息。较小的保单,包含1万个被保险人,返回页面需要等待7.5分钟。较大的保单,包含100万被保险人,返回页面等待了4个小时没有出来。团体保险明细比较大,分两个数据库保存。每...


问题描述


C保险公司业务系统中,团体保险明细查询速度很慢。查询时输入保单号,要返回团体保单包含的所有被保险人的信息。较小的保单,包含1万个被保险人,返回页面需要等待7.5分钟。较大的保单,包含100万被保险人,返回页面等待了4个小时没有出来。团体保险明细比较大,分两个数据库保存。每个团体保单的数据,在两个库中都有可能出现。数据库是Oracle,SQL语句共163行,如下图:分析解决


面对性能问题,需要仔细分析数据和计算的特征,定位性能关键点,通过改变数据的存储方式和计算方法逐步优化。第一步,确认需求前提。团体保险明细查询是应用系统中的一个功能,需要查询最新数据。如果采用ETL定时将数据导出计算的方式,不能满足这个要求。因此,还是要想办法从数据库取数、库外计算,来优化性能。第二步,了解业务需求特征。团体保险明细数据存放在两个数据库db1、db2,每个数据库都有两个表m1、m2。这四个表在查询时要合并查询结果,我们统一称为团体保险明细表。四个团体保险明细表有所不同,但是都可以查询出主要字段:保单号、保险成员号、批改次数、业务编号1、业务编号2、业务标志,还有姓名、性别年龄等个人信息“批改”是针对保险合同的调整,系统将调整后的最新保险明细也保存在团体保险明细表中,不会修改原保险明细,保留轨迹。在数据中通过“批改次数”字段体现。查询时,要查询批改次数最大的一次,也就是最新的数据。明细数据中还有一部分是无效数据。要看业务编号1和业务标志连接成的字符串是否在无效集合中。无效集合是指:同一个保单号的数据中,批改次数小于9,并且业务标志为D或者U时,业务编号2和字母A连接成的字符串形成的集合。如果业务编号1和业务标志连接成的字符串出现在无效集合中,这条记录就是无效的记录,要舍弃掉。第三步,梳理研究计算过程。SQL虽然比较长,但是可以分成几个部分。第一部分是两个数据库的4个团体保险明细表,各自按照保单号查询需要的数据,再用union合并在一起。第二部分是条件过滤,包括去掉无效数据和另外几个简单的条件。第三部分是用窗口函数row_number() OVER(PARTITION BY 保险成员号 ORDER BY 批改次数 desc),查找批改次数最大的明细记录。第一部分单独执行时,返回的结果数据量是几万到几百万,全部返回的时间比较长。如果用数据库JDBC游标的话,很快就能返回部分数据,比如几秒就可以返回几千条。第二部分,单独从数据库中取得无效集合只需要几秒,而且返回结果数据量不大,可以全内存。但是,第一部分和第二部分合并执行的时候,速度就变得很慢,即使是游标方式分批返回,也还是很慢。如果再加上第三部分,就更慢了。第四步,设计呈现方案。根据SQL分段执行的情况,确定采用流式大报表的方式实现提速,原理如下图:从数据库取数和呈现采用两个异步线程,取数线程发出 SQL 后不断取出数据经过复杂计算后,缓存到本地。再由呈现线程从本地缓存中获取数据进行显示。这样,已经取出并缓存的数据就能快速呈现,不再有等待感。第五步,设计计算过程优化方案。我们考虑将取数和计算分三段实现。第一段,上面说的第一部分SQL加上按照保险成员号和批改次数降序排序之后,用数据库JDBC游标依然能够快速分批取出部分数据。加上排序,可以在分批取出数据时,保证一个保险成员的数据相邻取出,在后续第三段中,就能够快速找到批改次数最大的最新数据。第二段,我们将这个保单的无效集合一次性取出到内存中,对第一段分批取出的数据进行过滤,计算出符合条件的有效明细。无效数据并不多,不会过滤掉太多的明细数据。第三段,根据被保险人号是否改变,判断是不是一个被保险人的第一条数据。因为明细数据按照被保险人和批改次数有序,所以当被保险人号改变的时候,第一条数据就是当前被保险人批改次数的最大值。这样就起到了,和上面说到的窗口函数一样的作用。由于每个保险成员的数据量都不大,一般是最多十几条数据(对应几次到十几次批改),而且无效数据并不多。所以第一部分分批取出的数据量不需要很多,就可以向前端批量返回数据了。这是流式大报表能够快速展现的必要条件。第六步,设计代码实现方案。使用延迟游标的方法实现上述三个分段。延迟游标的原理是,先依次定义三个分段的游标计算,定义的时候并不真的执行计算,而是在三个分段都定义好之后再执行。延迟计算的好处是可以一次遍历完成三个分段计算,不必生成中间结果占用空间,可以把查询结果分批提交给前端去展现。第三段游标计算比较复杂,需要用程序游标来实现。原理如下图:程序游标要做到被调用的时候,边计算边返回结果,这样才能达到流式大报表的要求。实际效果


根据计算特征拟定了优化方案后,需要选择合适的工具来实现计算和展现的性能优化。直接使用Java当然可以实现,但编码量过大,实现周期过长,容易出现代码错误隐患,也很难调试和维护。而开源的集算器SPL语言提供上述所有的算法支持,包括延迟游标、游标有序分段取出、程序游标等机制,能够让我们用较少的代码量快速实现这种个性化的计算。前端呈现需要支持流式大报表机制的报表工具,我们选择了润乾报表来实现。仅仅经过1天时间的编程、调试和测试,就完成了性能优化的验证,而且查询的响应速度非常快。较小的保单,包含1万个被保险人,原来返回页面需要等待7.5分钟,优化后的报表首页只需要3秒即可展现出来。较大的保单,包含100万被保险人,原来返回页面等待了4个小时没有出来,优化后的报表首页仅7秒即可展现出来,响应速度提高了2000倍还多。在编程难度方面,SPL做了大量封装,提供了丰富的函数,内置了上述优化方案需要的基本算法和存储机制。实际编写的代码很短,开发效率很高。上述取数的三段代码只有这么几行:后记


解决性能优化难题,最重要的是设计出高性能的计算方案,有效降低计算复杂度,最终把速度提上去。因此,一方面要充分理解计算和数据的特征,另一方面也要熟知常见的高性能算法,才能因地制宜地设计出合理的优化方案。本次工作中用到的基本高性能算法,都可以从下面这门课程中找到:点击这里学习性能优化课程(底部原文中可点击链接),有兴趣的同学可以参考。很遗憾的是,当前业界主流大数据体系仍以关系数据库为基础,无论是传统的MPP还是HADOOP体系以及新的一些技术,都在努力将编程接口向SQL靠拢。兼容SQL确实能让用户更容易上手,但受制于理论限制的SQL却无法实现大多数高性能算法,眼睁睁地看着硬件资源被浪费,还没有办法改进。SQL不应是大数据计算的未来。有了优化方案后,还要用好的程序语言来高效地实现这个算法。虽然常见的高级语言能够实现大多数优化算法,但代码过于冗长,开发效率过低,会严重影响程序的可维护性。开源SPL是个很好的选择,它有足够的算法底层支持,代码能做到很简洁,还提供了友好的可视化调试机制,能有效提高开发效率,以及降低维护成本。
对于本例中的报表呈现,还需要有能支持流式呈现的报表工具,这方面润乾报表有独特的优势,不需要全部取出数据就可以开始呈现,也不依赖于数据库分页机制(这种方法可能造成数据不一致)就可以支持高速前后翻页。这样才能获得业务用户的良好体验。正在为 SQL 性能优化头疼的同学们,可以和我们一起探讨:《慢得受不了的查询跑批》





本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

科睿唯安《全球创新Top100》以该公司拥有的专利数据库为基础,根据“成功率”、“地域投资”、“影响力”、“稀缺性”四个评价维度对知识产权进行分析,评选出全球百强创新企业和机构。该评选从2012年开始每年实施一次,202...

关键字: 数据库 5G 人工智能

北京——2024年2月26日 日前,领先的IT市场研究和咨询公司IDC发布《IDC MarketScape:全球云计算和以应用为中心的市场供应商评估》1报告,亚马逊位列“领导者”类别。报告指出,“亚马逊云科技Market...

关键字: 云计算 数据库 存储

2023年10月18日,中国在第三届“一带一路”国际合作高峰论坛期间发布《全球人工智能治理倡议》,围绕人工智能发展、安全、治理三方面系统阐述了人工智能治理中国方案。

关键字: 人工智能 大模型 代码

北京——2023年12月27日 在2023亚马逊云科技re:Invent全球大会上,亚马逊云科技表彰了在过去一年中,利用亚马逊云科技的技术和服务在推动客户创新及解决方案构建方面做出杰出贡献的卓越合作伙伴。8家亚马逊云科技...

关键字: 数智化转型 机器学习 数据库

北京——2023年12月7日 亚马逊云科技在2023 re:Invent全球大会上,宣布推出三项新的无服务器服务创新,涵盖了数据库和分析领域,使客户能够更快速、更轻松地扩展他们的数据基础设施,以支持最具挑战性的应用场景。...

关键字: 服务器 人工智能 数据库

北京——2023年12月4日 亚马逊云科技在2023 re:Invent全球大会上,宣布推出一系列新的集成解决方案,旨在帮助客户迅速而轻松地连接和分析数据,而无需构建和管理复杂的提取、转换和加载(ETL)数据管道。通过全...

关键字: 数据存储 数据库 人工智能

我们看到这么多的安全问题,部分原因在于我们对待安全的方式:安全性通常被认为是事后考虑的问题,是在开发结束时才添加到设备上的东西。然而,复杂的系统,尤其是嵌入式系统,有一个很大的攻击面,这让攻击者有机可乘,能够在“盔甲”上...

关键字: 代码 嵌入式系统 软件漏洞

北京——2023年11月13日 亚马逊云科技携手凯捷(Capgemini)中国共同发布《汽车行业可持续发展白皮书》(以下简称《白皮书》),并助力凯捷中国推出碳排放管理平台,致力于以数智化方式帮助车企解决在实践可持续发展过...

关键字: 数据库 机器学习 电动汽车

11月1日,由开放原子开源基金会主办,电子科技大学承办,深圳市腾讯计算机系统有限公司提供战略合作支持的2023年开放原子校源行(成都站)活动在电子科技大学圆满举行。本次活动以“聚缘于校,开源共行”为主题,将四川省在信息技...

关键字: 开源模式 操作系统 数据库

11月1日,2023杭州云栖大会上,阿里云瑶池数据库宣布已全面实现Serverless化,并接入通义等大模型能力,大幅提升数据库一站式及智能化水平。同时,PolarDB Always On系列推出3大重磅升级,首个数据智...

关键字: Serverless AI 阿里云 数据库
关闭