首页 > 其他分享 >存储过程何去何从

存储过程何去何从

时间:2024-11-28 10:31:34浏览次数:11  
标签:何去何从 存储 数据库 amount SPL SQL 过程

存储过程是个让人爱恨交加的东西。
它的意义自不必提,各大老牌数据库都支持,而且经常以此来挤兑一些还不支持存储过程的新数据库。反过来,它的缺点也很明显,能见到很多开发团队在努力拆除存储过程,在应用程序中实现所有的业务逻辑。
那么存储过程到底该何去何从?

存储过程的优点主要在于为 SQL 增加过程化能力。SQL 只能写成单句,但有些逻辑需要多步才能完成,复杂时还会出现分支循环,用单句的 SQL 就很难写甚至写不出来,存储过程也就应运而生了。
存储过程的缺点主要在架构层面。业务逻辑分拆到应用和数据库两处,要两边维护,不仅麻烦,还可能不一致。数据库中的存储过程也无法跟随现代应用架构实现扩展。各种数据库的存储过程语法大相径庭,经常还要维护多个版本。编译存储过程还需要较高的数据库权限,这又产生安全隐患和高效开发之间的矛盾。

开发应用的高级程序语言天然支持过程化,如果把业务逻辑都实现在其中,只是用 SQL 做基本的数据读写,就会同时获得存储过程的好处且避免掉它的缺点了。这不是两全其美吗?
话是这么说,拆除存储过程的同学们也是这么想的,但事情并没这么简单。

实现业务逻辑时,应用层并不是只要控制流程就可以了,它一样要参与数据处理,因为很多业务流程和数据强相关。而 Java 等高级程序语言没有完善的结构化数据类型和基础运算,用来做很多数据处理远没有 SQL 方便,结果写出来的代码非常繁琐冗长,尽管有了架构上的好处,但开发效率以及可维护性降低了很多。
Python 比 Java 略好一点,但仍然不如 SQL 顺手。而且,除非整个应用是 Python 写的,否则它糟糕的集成性又会导致新的架构问题。

esProc SPL 是个更好的选择。
esProc SPL 是纯 Java 的开源软件,它可以完全无缝地集成进 Java 应用中,就和应用程序员自己写的代码一样,一起享受成熟 Java 架构的优势。
esProc SPL 提供完善的结构化数据类型和丰富的计算函数,包括过滤、分组、连接等基本运算,完全覆盖 SQL 的内容,通常会比 SQL 写起来更简单。这些基本类库全是在 esProc 内自行实现,不像 ORM 技术那样还依赖于数据库。用 SPL 写出来的业务逻辑不依赖于数据库,天然具有可移植性。而且,SPL 还有用于转换 SQL 语句的方法 怎样写出可在各种数据库间移植的 SQL 语句 ,代码中必要的基本 SQL 语句也很容易被移植。
SPL 也有完善的流程控制语句,像 for 循环,if 分支都不在话下,还支持子程序调用,这就能实现存储过程的过程化能力了。只用 SPL 就能实现非常复杂的业务逻辑,直接构成完整的业务单元,不再需要上层主应用程序的代码来配合,主程序只是简单调用 SPL 脚本就可以了,方法也确实和调用数据库存储过程一样。

SPL 脚本可以存储成文件,和应用程序放在一起维护,这样就解决了业务逻辑两边维护可能导致的不一致问题。SPL 代码置于数据库之外,这相当于实现了 “库外”的存储过程 ,修改时完全不涉及数据库的任何权限,不存在安全隐患

特别是,SPL 是解释执行语言,代码修改后立即生效,不像 Stream/Kotlin 等 Java 类库在修改代码后还要和主程序一起重新编译,整个应用都要停机重启。这样可以做到业务逻辑的热切换,特别适合支持变化频繁的业务。

clipboardpng

我们再来看看 SPL 还有什么其它特点:

SPL 代码写在格子里,这和通常写成文本的代码很不一样。独立的开发环境简洁易用,提供单步执行、设置断点、所见即所得的结果预览,开发效率更高。而存储过程的调试就太麻烦了。

clipboardpng

这里 写在格子里的程序语言 有对 SPL 有更详细的介绍。

SPL 提供了比 SQL 更丰富的数据对象和计算库,代码通常会比存储过程中的 SQL 还要简洁很多,进一步提升开发效率和降低维护成本。

比如:找出销售额占到一半的前 n 个客户,并按销售额从大到小排序。SQL 写出来是这样的:

with A as (select client,amount,row_number() over (order by amount) ranknumber from sales)
select client,amount
from (select client,amount,sum(amount) over (order by ranknumber) acc from A
where acc>(select sum(amount)/2 from sales)
order by amount desc

SQL 很难处理恰好要过线的那条记录,只能变相实现,用了两层三个子查询,过程步骤不清晰,不易调试。
而 SPL 代码则有清晰明了的的过程步骤。

AB
1=sales.sort(amount:-1)/ 销售额逆序排序
2=A1.cumulate(amount)/ 计算累计序列
3=A2.m(-1)/2/ 最后的累计即总额
4=A2.pselect(~>=A3)/ 超过一半的位置
5=A1(to(A4))/ 按位置取值

SPL 支持的数据源也很多,现代应用早就不只是关系数据库这一种数据源了,但却只有关系数据库能提供复杂的存储过程机制。

clipboardpng

在 SPL 的支持下,可以让各种数据源都拥有存储过程的能力。

复杂的存储过程中常常会写出中间表以进行后续的计算,SPL 提供了高效的二进制格式文件格式,可以把中间数据落地到文件以便进一步做更细致的处理。而原生的 Java 以及 Python 都没这个便利,通常要使用文本文件或数据库来作为中间存储方案,性能很低且占用更多资源。

最后,esProc SPL 在这里 https://github.com/SPLWare/esProc。

免费下载

标签:何去何从,存储,数据库,amount,SPL,SQL,过程
From: https://blog.csdn.net/smilejingwei/article/details/144081921

相关文章

  • 数据存储的大端和小端
    在计算机系统中,数据的存储方式对性能、兼容性以及编程有着深远的影响。现代计算机都是以字节编址的,即每个地址下标对应一个字节,如果我们要以地址下标指代一个多字节数据(如4字节的int),就需要考虑四个字节的排列顺序。大端(BigEndian)和小端(LittleEndian)是两种常见的数据存储顺序......
  • Android四大组件的工作过程,原理解析
    一、Activity启动过程首先我们要知道Activity有冷启动和热启动之分,通俗来说冷启动就是应用进程尚未创建,热启动则已经创建完成。在点击桌面应用图标时,即将要启动的App将和Launcher、AMS、Zygote这三者多次通信,才会启动一个App,然后再启动Activity。追踪源码,我们可以得到以下......
  • Flink 热存储维表 使用 Guava Cache 减轻访问压力
    目录背景GuavaCache简介实现方案1.项目依赖2.GuavaCache集成到Flink(1)定义Cache(2)使用Cache优化维表查询3.应用运行效果(1)维表查询逻辑优化(2)减少存储压力GuavaCache配置优化总结背景在实时计算场景中,Flink应用中经常需要通过维表进行维......
  • 《建筑工程质量认定书》《住宅质量保证书》《住宅使用说明书》《房地产开发建设项目竣
    这些文件都是房地产开发过程中与房屋质量及合规性相关的重要证明文件。每个文件都有其独特的作用,确保房屋质量和安全,保护购房者的合法权益。下面我将对每个文件做一个简要的说明:《建筑工程质量认定书》该文件是房屋通过相关部门质量验收的凭证,通常由建设单位提供。它证明了建筑......
  • 信息资源管理文字题之“分析信息化发展过程中面临的实际问题和应对之策”
    一、材料:广州石化公司是中国石油化工股份有限公司在华南地区最大的现代化石油工企业之一。经过近几年的信息化发展,广州石化公司的内部动态信息资源建设已初具模型,建成了生产管理、质量管理、财务管理、销售、采购等应用系统,其数据类型包括TXT、DOC、XLS、WPS、PDF、PPT等。同时,广......
  • Vcenter7.0 no healthy upstream 解决过程
    参考连接:Vcenter7.0.3.01000nohealthyupstream解决过程-CSDN博客Vcenter证书过期--Vcenter无法登录,密码错误,签名无效,503(方法2)_service-controlfailed.error:failedtostartser-CSDN博客一、报错信息:访问服务器,有如下报错信息重启后错误依旧。二、root登......
  • GaussDB数据库存储过程介绍
    @目录一、前言二、GaussDB中的定义三、存储过程的使用场景四、存储过程的使用优缺点五、存储过程的示例及示例解析1、GaussDB存储过程语法格式2、GaussDB存储过程语法示例3、存储过程的调用方法七、总结一、前言华为云数据库GaussDB是一款高性能、高安全性的云原生数据库,在数据......
  • SpringBoot源码-spring boot启动时配置properties和yml文件解析过程以及spring.profil
    1.当我们启动一个SpringBoot项目的时候,入口程序就是main方法,而在main方法中就执行了一个run方法。@SpringBootApplicationpublicclassStartApp{ publicstaticvoidmain(String[]args){ //test SpringApplication.run(StartApp.class); }} publicstati......
  • 芯片基础详解:总线、256字节随机存储器、模式选择器(指令解码器)、条件判断器
    总线总线:从正确的输入端将数值复制到正确的输出端。总线电路------------------------------------------------------------------------------------------256字节随机存储器256字节随机存储器电路---------------------------------------------------------------......
  • uboot编译过程
    文章目录makexxx_defconfig生成.config文件make生成配置文件概述makesilentoldconfigmake-fscripts/Makefile.autoconf生成u-boot.bin生成elf文件和bin文件Makefile.buildmakexxx_defconfig生成.config文件makexxx_defconfig的目标就是生成.config文件。......