快出数量级的性能是怎样炼成的

简介: 我们通过使用开源 SPL 重写了多个金融行业的 SQL 任务,实现了显著的性能提升,如保险公司团保明细单查询提速 2000+ 倍、银行 POS 机交易报表提速 30+ 倍等。这些优化的核心在于使用了更低复杂度的算法,而非依赖硬件加速。SPL 基于离散数据集理论,提供了丰富的高性能算法,使得复杂任务的优化成为可能。更多案例和详细技术解析可参见乾学院的相关课程和图书。

我们之前做过一些性能优化的案例,不算很多,还没有失手过。少则提速数倍,多则数十倍,极端情况还有提速上千倍的。提速一个数量级基本上是常态。之前发过几个,后面还会继续发,感兴趣的可以去乾学院看看具体,简单列举几个:
开源 SPL 提速保险公司团保明细单查询 2000+ 倍
开源 SPL 提升银行自助分析从 5 并发到 100 并发
开源 SPL 提速银行用户画像客群交集计算 200+ 倍
开源 SPL 优化银行预计算固定查询成实时灵活查询
开源 SPL 将银行手机账户查询的预先关联变成实时关联
开源 SPL 提速银行资金头寸报表 20+ 倍
开源 SPL 提速银行贷款协议跑批 10+ 倍
开源 SPL 优化保险公司跑批从 2 小时到 17 分钟
开源 SPL 提速银行 POS 机交易报表 30+ 倍
开源 SPL 提速银行贷款跑批任务 150+ 倍
开源 SPL 提速资产负债表 60 倍

这是怎么做到的呢?
这些被提速的场景都有一个共同点:原先都是用各种数据库(也有 HADOOP/Spark)上的 SQL 实现的,包括查询用的几百行 SQL 也有跑批用的几千行存储过程,然后我们改用集算器的 SPL 重新实现之后就有了这样的效果。
集算器 SPL 有什么神奇之处?是不是能让各种运算跑得更快?
有点遗憾,并没有这样的好事。集算器也是一个软件,而且是用 Java 写的,完成同样运算通常比 C/C++ 写的数据库还要慢一点。
那是怎么回事?

根本原因在于我们用 SPL 实现了不同的算法。软件不能提高硬件的速度,但我们可以设计出更低复杂度的算法,有效地减少计算量,然后速度自然就上去了。一个运算任务本来要做 1 亿次加法,如果能减到 100 万次,那自然就能快 100 倍,即使每次运算都变得稍慢一点,总体性能仍然会提高,这一点也不神奇。
只要能实现高性能算法和存储,用什么技术来做并不重要了。用 C/C++、Java 当然都能做出来。事实上,集算器是用 Java 写的,用 Java 直接实现这些算法原则上还会更快一点,用 C/C一般还能更快(Java 的内存分配消耗时间还是有点多)。
不过,虽然用 Java 和 C能写出比 SPL 更快的代码,但要长得多(估计会长出 50-100 倍),这会导致开发工作量过大,这在实际应用时也是要权衡的一个指标。有时候,跑得快和写着简单其实是一回事,就是能高效率地实现高性能算法。
集算器的 SPL 中强化了结构化数据的数据类型,并提供了很多基础的高性能算法。写代码就是组合运用这些算法,当然会方便得多。要说神奇之处,也就是这一点了。

那么,继续 SQL 就不能做到同样的事吗?
是的。SQL 设计得过于粗线条,关系代数这个理论基础中缺乏很多数据类型和基础运算,很多高性能算法都无法描述,结果只能使用慢算法。虽然现在很多数据库和大数据平台都在工程上有所优化,但也只能针对简单的场景,情况复杂之后数据库的优化器都会“晕”掉,所以解决不了根本问题。这是个理论上的问题,无法在工程层面解决。
SPL 基于的理论基础不再是关系代数,而是我们发明的离散数据集。在这个体系下有更多的数据类型和运算,就能写出更多高性能算法了。SPL 是离散数据集的一种实现,封装了许多现成的算法。用 Java 和 C++ 当然也能从头来实现这个代数体系,因而都能写出来高性能代码。而 SQL 却不可以。

举个简单的例子,我们想在 1 亿条数据中取出前 10 名,用 SQL 写出来是这样的:

select top 10 x,y from T order by x desc

这个语句中有个order by,严格按它执行就会涉及大排序,而排序非常慢。其实我们可以想出一个不用大排序的算法,但用 SQL 却无法描述,只能指望数据库优化器了。对于这句 SQL 描述的简单情况,很多商用数据库确实都能优化,使用不必大排序的算法,性能通常很好。但情况复杂一些,比如在每个分组中取前 10 名,要用窗口函数和子查询把 SQL 写成这样:

select * from
    (select y,*,row_number() over (partition by y order by x desc) rn from T)
where rn<=10

这时候,数据库优化器就会犯晕了,猜不出这句 SQL 的目的,只能老老实实地执行排序的逻辑(这个语句中还是有 order by 的字样),结果性能陡降。
而 SPL 不一样,离散数据集中有普遍集合的概念,TopN 这种运算被认为是和 SUM 和 COUNT 一样的聚合运算,只不过返回值是个集合而已。这时候写出来的取前 10 名的语句中并没有排序动作:

T.groups(;top(-5;x))

分组后的写法也很简单,都不需要执行大排序:

T.groups(y;top(-5;x))

这里 性能优化技巧:TopN 还有关于这个问题的更详细测试对比。

所以,我们做性能优化时要重写代码,不能继续使用 SQL 保持兼容。要读懂原来的逻辑重新实现,这个工作量还是很大的,不过能换来数倍数十倍的性能提升,常常还是值得的。
另外,存储也非常重要,好算法要有合适的存储机制配合才能生效,所以不能继续把数据继续存在数据库里获得高性能,需要搬出来换种办法组织存放。改变存储后,有可能把原来需要缓存的计算过程变成不需要了,原来要遍历多遍的运算变成只遍历一次甚至不用遍历了,减少硬盘访问量对性能的提升非常有效。

从上面这个原理上看,如果我们不能针对计算目标设计出更好的算法,那就做不到提速了。比如一个很简单的大表求和,用 SQL 要做 1 亿次,用 SPL 也要做 1 亿次,那就不可能做得更快,一般还会更慢一点(Java 赶不上 C/C++)。但是,当运算任务足够复杂时,碰到几百上千行的嵌套 N 层 SQL(慢的 SQL 通常也不会太简单),几乎总能找到足够多可优化的环节,所以我们经历过的案子还没有失手过。结果,在实践上用 Java 写出来集算器大幅度超越了 C/C++ 写的数据库,这都是算法造就的。
我们甚至曾经发过一个征询,寻找用 SQL 写的慢过程,我们负责提速一个数量级。

换个角度再看这个提速原理:高性能靠的不是代码,而是代数,代码只是个实现手段而已。其中最关键的是掌握和运用这些算法,而不是 SPL 语法。SPL 语法很简单,比 Java 容易多了,两小时就能基本上手,两三周就能比较熟练了。但算法却没那么简单,需要认真学习反复练习才能掌握。这些案例直接由没有经验的用户自己做常常效果并不好,主要原因也是对算法没有吃透。
反过来,而只要掌握了算法,用什么语法就是个相对次要的问题了(当然用 SQL 这种太粗线条的语言还是不行)。这就像给病人看病,找出病理原因后,能分析出什么成分的药能管用。无论直接购买成药(使用封装过的 SPL),还是上山采药(使用 Java/C++ 硬写),都可以治好病,无非就是麻烦程度和支付成本不同。

可能有读者对 SPL 提供了哪些与 SQL 不同的高性能算法感兴趣,推荐一下乾学院上的性能优化图书和视频课程,有兴趣可前往看看。
我们已经把这些算法都整理成有体系的知识了。有些算法是业界首创的,其它教科书和论文中都找不到。
跟着这些图书课程学习,掌握这些算法后,就可以自己写到快出数量级的高性能代码。即使自己不写代码,也能理解原理,不会再被很多大数据产品喊什么“万亿秒查”的说法忽悠了。

相关文章
|
消息中间件 Apache RocketMQ
rocketmq客户端发送消息报错和超时问题
org.apache.rocketmq.remoting.exception.RemotingTimeoutException: wait response on the channel <10.0.21.69:10911> timeout, 1000(ms)、 closeChannel: close the connection to remote address
5438 1
rocketmq客户端发送消息报错和超时问题
|
SpringCloudAlibaba NoSQL 安全
SpringCloudAlibaba篇(九)SpringCloudGateWay整合Oauth2+Jwt实现认证中心
SpringCloudAlibaba篇(九)SpringCloudGateWay整合Oauth2+Jwt实现认证中心
3171 0
SpringCloudAlibaba篇(九)SpringCloudGateWay整合Oauth2+Jwt实现认证中心
|
存储 运维 监控
当游戏爱上MongoDB!阿里云&MongoDB中国区域游戏行业私享会
始于2019年底的新冠疫情改变了我们的生活方式,游戏成为了很多人排遣寂寞的一种方式,由此带来了游戏市场的异常火爆。游戏市场比拼的是谁能更快速地开发迭代,让玩家体验更佳,因此能够敏捷开发、快速扩展、全球部署和轻运维的数据库产品无疑将为游戏的开发和后期运营奠定良好的基础。 诚邀您与Mongo DB、阿里云数据库专家团队, 以及游戏行业同行共同探讨如何使用Mongo DB帮您打造全球化高效、易用、稳定的数据库架构,并为您详细解读MongoDB5.0新特性在游戏行业的最佳实践。
4633 1
当游戏爱上MongoDB!阿里云&MongoDB中国区域游戏行业私享会
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
智能自动化全方位解读:定义、技术、市场、应用,一文解答所有
智能自动化融合AI与RPA技术,重塑企业效率。它可处理非结构化数据、跨系统协同、自主决策,广泛应用于财务、人力、制造等领域,助力降本增效、合规创新。2025年全球市场规模将达4200亿美元,中国超9500亿元,成为最大单一市场。实在Agent等标杆产品实现“一句话完成工作”,5000+企业已落地应用,部署快、回报高、无需改造系统,正推动人机协同的数字革命。
832 154
|
12月前
|
运维 安全 Linux
优雅告别系统(Linux用户退出脚本全解析)
本文教你如何编写Linux用户退出脚本,确保安全退出会话、清理资源并记录日志。涵盖基础命令(exit/logout)、脚本编写、自动触发与最佳实践,适合新手和运维人员提升系统安全性。
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
1802 2
|
存储 SQL 人工智能
阿里云ODPS 使用实践的深度总结
本内容深入解析ODPS在大数据实践中的核心价值与挑战,涵盖分布式架构、流批一体、成本控制等关键技术,结合制造业、营销等场景案例,展示从数据治理到智能决策的跃迁路径,并展望未来边缘协同、AI平民化等前沿方向。
770 2
|
8月前
|
JSON 算法 API
通过京东开放平台API根据商品ID获取商品详情技术指南
本文详解京东开放平台商品详情API调用:从注册账号、获取App Key/Secret,到签名生成、Python代码实现及错误处理,涵盖准备工作、接口参数、完整示例与安全注意事项,助开发者快速可靠接入。(239字)
|
10月前
|
Java Maven
【2026最新】Maven配置阿里云镜像
本文介绍在Maven 3.9与JDK 21环境下,如何配置阿里云镜像加速依赖下载。通过修改Maven的conf/settings.xml文件,在&lt;mirrors&gt;标签中添加阿里云公共仓库镜像配置,提升构建效率。
8282 1
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
845 25

热门文章

最新文章