程序员过关斩将--你为什么还在用存储过程?

640?wx_fmt=png点击上面“蓝字”关注,带你看好电影

菜菜哥,我新接手了一个项目,看的我头疼呀

640?wx_fmt=png640?wx_fmt=jpeg

业务有这么复杂呀?

640?wx_fmt=png640?wx_fmt=jpeg

不是的,这个老项目完全是用存储过程写的,每个存储过程都好几百行

640?wx_fmt=png640?wx_fmt=jpeg

这样呀,是够头疼的~

640?wx_fmt=png640?wx_fmt=jpeg

有没有办法帮我了解业务一下?

640?wx_fmt=png640?wx_fmt=jpeg

碰到这样的情况,我真帮不了你了,你可以多埋怨几句做的那个人~~~

640?wx_fmt=png640?wx_fmt=jpeg640?wx_fmt=png640?wx_fmt=png存储过程640?wx_fmt=png640?wx_fmt=gif

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

优势

640?wx_fmt=gif

1. 可以减少程序在调用DB时候的信息传输量(其实减少的只有Request的时候)

2. 存储过程是预先优化和预编译的,节省每次运行编译的时间,所以一般情况下认为存储过程的性能是优于sql语句的。

3. 对调用者可以隐藏数据库的复杂性,将数据组装的过程封装。

4. 参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

5. 如果业务开发中,数据人员和业务代码人员是分离的,业务人员可以不用关心数据,直接调用存储过程,更加面向分层开发设计理念。

劣势

640?wx_fmt=gif

1. 存储过程这种“一次优化,多次使用”的策略节省了每次执行时候编译的时间,但也是该策略导致了一个致命的缺点:可能会使用错误的执行计划。

2. 存储过程难以调试,虽然有些DB提供了调试功能,但是一般的账号根本就没有那种权限,更何况线上的数据库不可能会给你调试权限的,再进一步就算能调试效果也比程序的调试效果要差很多。

3. 可移植性差,当碰到切换数据种类的时候,存储过程基本就会歇菜。

4. 如果业务数据模型有变动,存储过程必须跟着业务代码一起更改,如果是大型项目,这种改动是空前的,是要命的。

640?wx_fmt=png不推荐存储过程640?wx_fmt=png640?wx_fmt=gif

以上存储过程的优缺点,你随便一下网络就可能查到,表面看来存储过程的优势还是不少的,这也说明为什么老一辈程序员有很多喜欢写存储过程。但是随着软件行业业务日益复杂化,存储过程现在在复杂业务面前其实有点有心无力。

菜菜在业务中并不推荐使用存储过程,辩驳请留言。

640?wx_fmt=png640?wx_fmt=gif


1. 采用存储过程操作数据在网络数据量传输上确实比直接使用sql语句要少很多,但这通常并不是操作数据系统性能的瓶颈,在一次操作数据的过程中,假设用时100毫秒,采用存储过程节省数据传输时间0.5毫秒(就算是5毫秒),我觉得这点时间基本可以忽略。

2. 存储过程是只优化一次的,这有时候恰恰是个缺陷。有的时候随着数据量的增加或者数据结构的变化,原来存储过程选择的执行计划也许并不是最优的了,所以这个时候需要手动干预或者重新编译了,而什么时候执行计划不是最优的了这个平衡点,预先无法知晓,这就导致了有些应用突然会变慢,程序员处于懵逼的状态。

3. 存储过程确实可以对调用方隐藏数据库的细节,但是这种业务代码人员和数据库设计人员是两个团队的情况又有多少呢,如果真是两个团队,那业务就需要两个团队来理解和沟通,我想沟通的成本也一定很高,而且分歧更容易产生。


菜菜认为数据库就应该做它最擅长的事情:存储相关。我不止一次的看过把业务写在存储过程的情况,程序代码层面真是薄薄的贫血层,就是一个数据的透传。我不赞同这种写法,因为我就接手过这样的程序,令我头疼的不是业务,而是看着好几千行的存储过程熟悉业务,关键还没有调试的权限(线上更不能调试)。


一个业务系统的设计往往需要你从数据库的层面抽离出来,把主要精力放在业务模型的设计上,在程序层面体现业务逻辑,而不是把业务逻辑都交给数据层面的管理者。前几天我排查过一个“Bug”:存储过程是输入参数是一个主键id的列表字符串,长度居然是 nvarchar(max),主要功能是根据id列表查询数据。我想说的是就算你是max的长度,也有超长的可能性发生,因为业务方传输什么参数,参数什么长度是你DB无法控制的,所以这类的业务一定要放在程序中做处理,而不是怀着侥幸心里丢给DB。


如果是抱着存储过程性能高的心态的话,我到时觉你这是误入歧途,菜菜认为存储过程从来都不是提高性能的关键,反而系统的架构,缓存的设计,数据一致性更是系统关键问题。

存储过程通常是一种解决方案,但是通常情况下不是唯一的解决方案,在选择存储过程作为方案前,请确保他们是正确的选择。

最后秀一波存储过程吧

640?wx_fmt=gif

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=gifTHE END640?wx_fmt=png


640?wx_fmt=gif●程序员修神之路--问世间异步为何物?●程序员修神之路--提高网站的吞吐量?●程序员修神之路--?分布式高并发下Actor模型如此优秀?●程序员过关斩将--论商品促销代码的优雅性●程序员过关斩将--请不要随便修改基类●程序员过关斩将--你的面向接口编程一定对吗?●程序员修神之路--高并发下为什么更喜欢进程内缓存●程序员修神之路--高并发优雅的做限流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 101 (Rated for Div. 2) C. Building a Fence 思维取范围

传送门 题意: 思路: 刚看到这个题其实是没什么思路,想过从前往后推或者从后往前推,但是都不是很可行。因为两边都有一个固定的挡板挡住,我们可以根据其中的一个算出来每个位置高度的范围,让后检查一下范…

CF1237F Balanced Domino Placements(组合计数,dp)

CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌,再考虑竖着的骨牌。但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响。 然而事实上我们只需要换一个统计顺序,先考虑横着的骨牌的列和竖着的骨牌的行&#xff0…

asp.net core 集成JWT

【什么是JWT】JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。JWT的官网地址:https://jwt.io/通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT令牌在api接口中校验用户的身份以确认用户是否有访问api的权…

2021年度训练联盟热身训练赛第一场 E Early Orders 思维 + 栈

传送门 题意: 给nnn个数,一个kkk,求aaa中包含1−k1-k1−k且字典序最小的子序列。 思路1: 记p[i]p[i]p[i]为iii出现的最后位置,让后维护一个栈,当这个数不在栈里时将其入栈,入栈的时候跟栈顶比…

CF855G. Harry Vs Voldemort(边双,并查集,dp)

CF855G. Harry Vs Voldemort Solution 考虑每增加一条边都会把路径上的边双都连成一个大边双,考虑合并xxx和yfaxy fa_xyfax​ 这两个边双的贡献,分类讨论: 选取三个同边双内的点。选取在同一个边双内选两个点,剩下一个在其他边…

xBIM(eXtensible Building Information Modelling)可扩展的建筑信息模型

一、xBIM 简介BIM(Building Information Modelling)建筑信息模型,xBIM(eXtensible Building Information Modelling)可扩展的建筑信息模型。它是一个.NET 开源软件开发BIM工具包,支持BuildingSmart数据模型…

Codeforces Global Round 12 C1 C2. Errich-Tac-Toe 思维构造 好题

传送门 题意: 给了如下规则,上面三个只要出现一个情况就是非平局,现在给你个字符矩阵,让后其中XXX字符有KKK个(hardhardhard版本XXX和OOO一共KKK个),每次操作可以将XXX变成OOO,OOO变成XXX,用不…

AGC019D - Shift and Flip(枚举)

AGC019D - Shift and Flip 很久之前WAWAWA的题,终于补掉了。。。这题细节是真的烦。 Solution 这题数据范围较小,于是我们枚举最终AAA与BBB的哪一个字符开始匹配,设这个位置为SSS。 然后考虑分顺时针/逆时针转到SSS两种情况讨论。 以逆时…

译 | .NET Core 3.0 Preview 6 已发布

原文:Richard Lander翻译:Edi Wang今天,我们宣布 .NET Core 3.0 Preview 6。它的更新包括编译程序集以改进启动、使用链接器和 EventPipe 改进优化应用程序的大小。我们还在 ARM64 上发布了针对 Alpine 的新 Docker 镜像。立即在 Windows、ma…

Codeforces Global Round 12 D. Rating Compression 思维 + 贪心

传送门 题意&#xff1a; 给一个长度为nnn的数组aaa&#xff0c;定义一个数组bbb&#xff0c;且bjminj<i<jk−1aib_jmin_{j<i<jk-1}a_ibj​minj<i<jk−1​ai​&#xff0c;比如j3j3j3的时候&#xff0c;a[1,3,4,5,2]a[1,3,4,5,2]a[1,3,4,5,2]&#xff0c;b3…

CF528C. Data Center Drama(欧拉回路,构造)

CF528C. Data Center Drama Solution 容易发现&#xff0c;加边后的图必然满足所有点的度为偶数&#xff0c;并且总的边数是偶数&#xff0c;这启发我们使用欧拉回路。 设欧拉回路为vk1et1vk2et2vk3...vk∣E∣1v_{k_1}e_{t_1}v_{k_2}e_{t_2}v_{k_3}...v_{k_{|E|1}}vk1​​et…

庆祝.NET Core悄然崛起:免费送50本优秀技术书籍,请笑纳!!

为了庆祝 .NET社区蓬勃发展&#xff0c;今天特地联合几位.NET大佬给大家带来50本高质量技术书籍。.NET Core自开源以来&#xff0c;依托微软强大的科技实力日趋完善&#xff0c;再也不是10年前那种封闭状态。强大的跨平台&#xff0c;强大的IDE&#xff0c;强大的语言特性&…

P2371 [国家集训队]墨墨的等式 同余最短路

传送门 题意&#xff1a; 思路&#xff1a; 一个同于最短路的板子题&#xff0c;初始的时候值为0&#xff0c;所以设dis[0]0dis[0]0dis[0]0&#xff0c;让后选择一个最小的a[i]a[i]a[i]作为basebasebase&#xff0c;跑一遍同余最短路就好啦。跑完dis[i]dis[i]dis[i]表示在模b…

CF997E. Good Subsegments(线段树,单调栈)

CF997E. Good Subsegments Description 给定一个序列&#xff0c;多次询问一个区间内的连续段个数。 n,q≤2105n,q \leq 2\times 10^{5}n,q≤2105 Solution 算得上是经典题了吧。 Part one 先考虑求全部的连续段个数。 相当于求区间内mx−mn1−len0mx - mn 1 - len 0m…

ASP.NET Core WebAPI帮助页--Swagger简单使用1.0

1、什么是Swagger&#xff1f;Swagger是一个规范且完整的框架&#xff0c;提供描述、生产、消费和可视化RESTful API&#xff0c;它是为了解决Web API生成有用文档和帮助页的问题。2、为啥选用swagger?1&#xff09;它具有交互式文档、客户端SDK生成和API可发现性等优点。2&am…

Codeforces Global Round 12 E. Capitalism 差分约束

传送门 题意&#xff1a; 思路&#xff1a; 一开始被题意迷惑了&#xff0c;没看出来差分约束&#xff0c;老菜鸡啦。首先看到ajai1a_ja_i1aj​ai​1可以把aia_iai​分成奇偶&#xff0c;让后这个图就变成一个二分图了。再考虑如何连边&#xff1a; (1) 对于b1b1b1的情况&…

ARC114E - Paper Cutting 2(组合数学,概率与期望)

ARC114E - Paper Cutting 2 Solution 考场上时间不够&#xff0c;没刚出来QAQ。 做法和官解本质相同&#xff0c;只是官解运用期望的线性性直接导出答案&#xff0c;而这里是对于所有方案统计贡献在除以方案数&#xff0c;从期望的定义上计算答案。可能稍显复杂。 Part one…

8个月打磨,一份送给程序员的「分布式系统」合集

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「75」篇原创敬上整理好的文章目录在文末&#xff0c;可直接拉到最后是的&#xff0c;这份礼物最佳受众是程序员。但是&#xff0c;如果你不是程序员&#xff0c;相信这些能使你…

HDU - 6071 Lazy Running 同余最短路 + 分层

传送门 题意&#xff1a; 给定四个点构成一个环&#xff0c;给出四个点之间的距离&#xff0c;让后从222号点出发&#xff0c;最终回到222号点&#xff0c;求经过的距离>k>k>k的最小距离。 思路&#xff1a; 由于从222开始&#xff0c;最终在222结束&#xff0c;所以…

CF1398F

CF1398F Solution 我又来贡献暴力做法了。。。听说两只log不可能过1e6? 有一个显然的想法是&#xff1a; 我们先预处理一个aia_iai​表示第iii个位置的最长后缀长度&#xff0c;满足该后缀中不同时存在0和1。 假设我们要求xixixi的答案&#xff0c;那么一个位置jjj可以作…