存储过程真的是洪水猛兽吗?

1 天前
 liuidetmks

很多开发者一提到 SQL 就“谈此色变”,觉得难以调试、难以定位 bug
最后就是一句话,就是这个东西碰不得,是邪教


存储过程这个东西存在这么久,不可能一无是处吧

有没有可能,像 TypeScript 转译为 JavaScript 一样,有一种高级语言可以:

11452 次点击
所在节点    数据库
114 条回复
aureole999
1 天前
@lujiaxing 也不能这么说,像我以前做证券,一样有支付什么的啊,也不用存储过程。像支付宝什么的,也不见得非要用存储过程吧。

以前存储过程确实在这方面比较好用,所以用得多,后面人们慢慢发现了缺点就用得少了。但有些项目有历史包袱还是得接着用。如今微服务什么的,用得很多,现在缺点也逐渐暴露出来,以后怎么样还不知道。每个技术都有时代的局限性。
wxf666
1 天前
@sanmaozhao #11
@pipixiarwksb #36

有 AI 的年代,改写成不同语言,应该都不是啥问题吧。。


@dlmy #32

5W SQL 转成编程语言实现,复杂性会降低多少呢?感觉 SQL 实现一般都更简短呀。。
layxy
1 天前
搞不明白,明明代码可以处理,非要写存储过程,搞得代码逻辑处理一半,存储过程处理一半,徒增心智负担
jeffreyWang007
1 天前
也很好奇,存储过程应该如何做版本管理?
lujiaxing
1 天前
@aureole999 银行的账务逻辑比证券复杂多了.
lesismal
1 天前
很多传统企业级、FinTech 用 IOE 之类的那套,量级不那么大,安全性第一,可以、但不是必须。

其他 ToC 尤其是国内这些:
1. 海量用户海量并发的,存储过程单点性能就不太合适了
2. 业务需求的快速迭代,存储过程开发和维护都是不合适的

国内很多企业去 IOE 的过程中,存储过程也越来越少、很多团队已经消灭存储过程了。

老屎山,能不动,就不动;
新项目,能不用,就不用。
ZGame
1 天前
并不是,很难说现在的 flinksql 大数据那一套不算另一种方式的存储过程。 最主要是如何包装和平台化,让其他非开发人员也参与进来。 并且能够妥善的维护 而不是丢到数据库里就不管了。 所以还是屁股决定脑袋,你是 dba 还是开发 可能有不同的感受
dabao
1 天前
你是不是在找“ORM”
ytll21
1 天前
@lujiaxing #65 银行的账务逻辑比证券复杂多了.
---------------------
无法认同。都是语言,不存在只有存储过程才能对应的业务逻辑。

存储过程当初出现的原因,是因为大型机,以及前后端分离的技术不成熟。但是随着云计算的出现,算力已经不成为问题,那么存储过程的语言问题就变成了阻碍,无法方便的重构,调试和缺少语法糖,都是影响开发效率的存在。

现在还在用存储过程的企业,只能认为是有历史包袱在,迫不得已的选择。
ytmsdy
1 天前
如果当年没有去 IOE 的运动,估计现在还有一大波的人在写存储过程。
存储过程写起来是爽,多表关联,批量更新,效率也非常高。大约 2014 年,2015 年之前的 ERP 系统,后面的业务逻辑基本上都是存储过程,银行系统,电力系统,大型企业的内部管理系统,基本上都是存储过程。
但是维护这玩意儿也是噩梦,没日志,debug 麻烦。有时候业务提交上来一个 bug ,你定位到了 bug 是在具体哪个存储过程导致的,然后要修这个 bug 的时候,有时候是很绝望的!
之前关于存储过程不是有这么一个冷笑话么,系统出现 bug 了,一个程序猿搞了两个礼拜,然后经理说,我现在有一个好消息和一个坏消息。好消息是我定位到了 bug 是在那个存储过程里面产生的,坏消息是这个存储过程有 3000 行。
dabao
1 天前
@lujiaxing 经常帮老开发们优化数据库性能,存储过程写的屎一般,甚至表连个索引都没有,存储过程还用来各种抓取同步耗时且大量的数据
ytmsdy
1 天前
@jeffreyWang007
做得好的公司会和普通代码一样,导出成 SQL ,然后上传 SVN 或者 git 。
做的不好的公司就直接运行发布了,最多在存储过程里面写一下注释,把之前的逻辑注释掉,然后写新的逻辑
realpg
1 天前
本地那种商业软件放心用 0.1QPS 都没有的 无所谓性能

你给 1KQPS+的互联网服务大众的系统数据操作都扔存储过程里 大概率卡到地球另一边
seansong
1 天前
存储过程比直接写在应用代码里面,更难以调试,版本控制也难,同时 pgSQL 之类的数据库语言的表达能力也显著弱于应用层语言,倒不是说存储过程不能用,只是必要性越来越低,出于熟悉程度、调试之类的考虑,就慢慢被越来越淘汰了
yingqi1
1 天前
只要弄好 单元测试 / 版本管理,什么语言都无所谓。
nuk
1 天前
如果是复杂的存储过程我们一般都是自动转译的,sql 基本没办法调试,没必要在上面浪费人力。
xshell
1 天前
新功能都不让使用存储过程,老代码里面有存储过程让能正常运行就行·
lujiaxing
1 天前
@ytll21 不用存储过程, 用程序处理的话, 终归会有反复与数据库交互的过程. 十次八次的还好, 像某些银行那样的系统, 一笔交易涉及各种跨库跨表查询几十个 (尤其有不少还涉及到本地服务, 如水电气缴费, 地方分行/支行企业合作业务, 自动扣费业务/罚款等), 反复与数据库交互的这个通讯的成本是很高的. 一般来说银行的各种交易必须在几百毫秒之内结束, 而且不可以出现单据不一致的情况. 这与互联网企业的最终一致性要求是不一样的. 银行, 电信系统之类的, 要求的都是实时强一致性. 在这种需求之下, 存储过程是最好的. 至于研发难度, 反正也不是老板需要面对的事情. 有难度你们研发慢慢啃去呗.
lujiaxing
1 天前
@ytll21 当然, 如果系统没有这么强的一致性要求, 用存储过程就纯属是给自己找不自在.
CoderGeek
1 天前
我现在碰到的 一个业务 代码 30%基本校验 参数传递 然后调存储过程 70%逻辑在哪里 不恶心吗 真的很恶心

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1130319

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX