公司的系统是自主开发的,历史比较悠久,有不少是传统C/S架构,采用存储过程来处理业务逻辑。

近来做新系统的时候,我采用了三层架构,抛弃存储过程改用ORM。

有同事问及不用存储过程的理由,我想了一下,对存储过程做了如下总结。

本人经验和水平有限,总结有所偏颇,还请大家纠察。

优点

1.在生产环境下,可以通过直接修改存储过程的方式修改业务逻辑(或bug),而不用重启服务器。但这一点便利被许多人滥用了。有人直接就在正式服务器上修改存储过程,而没有经过完整的测试,后果非常严重。

2.执行速度快。存储过程经过编译之后会比单独一条一条执行要快。但这个效率真是没太大影响。如果是要做大数据量的导入、同步,我们可以用其它手段。

3.减少网络传输。存储过程直接就在数据库服务器上跑,所有的数据访问都在服务器内部进行,不需要传输数据到其它终端。但我们的应付服务器通常与数据库是在同一内网,大数据的访问的瓶颈会是硬盘的速度,而不是网速。

4.能够解决presentation与数据之间的差异,说得文艺青年点就是解决OO模型与二维数据持久化之间的阻抗。领域模型和数据模型的设计可能不是同一个人(一个是SA,另一个是DBA),两者的分歧可能会很大——这不奇怪,一个是以OO的思想来设计,一个是结构化的数据来设计,大家互不妥协——你说为了软件的弹性必须这么设计,他说为了效率必须那样设计,为了抹平鸿沟,就用存储过程来做数据存储的逻辑映射(把属性映射到字段)。好吧,台下已经有同学在叨咕ORM了。

5.方便DBA优化。所有的SQL集中在一个地方,DBA会很高兴。这一点算是ORM的软肋。不过按照CQRS框架的思想,查询是用存储过程还是ORM,还真不是问题——DBA对数据库的优化,ORM一样会受益。况且放在ORM中还能用二级缓存,有些时候效率还会更高。

缺点

1.SQL本身是一种结构化查询语言,加上了一些控制(赋值、循环和异常处理等),但不是OO的,本质上还是过程化的,面对复杂的业务逻辑,过程化的处理会很吃力。这一点算致命伤。

2.不便于调试。基本上没有较好的调试器,很多时候是用print来调试,但用这种方法调试长达数百行的存储过程简直是噩梦。好吧,这一点不算啥,C#/java一样能写出噩梦般的代码。

3.没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。

4.无法适应数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

5.精通SQL的新手越来越少——不要笑,这是真的,我面试过N多新人,都不知道如何创建全局临时表、不知道having、不知道聚集索引和非聚集索引,更别提游标和提交叉表查询了。好吧,这个缺点算是凑数用的,作为屌丝程序员,我们的口号是:没有不会的,只有不用的。除了少数有语言洁癖的人,我相信精通SQL只是时间问题。

总结

存储过程最大的优点是部署的方便性——可以在生产环境下直接修改——虽然滥用的后果很严重。

存储过程最大的缺点是SQL语言本身的局限性——我们不应该用存储过程处理复杂的业务逻辑——让SQL回归它“结构化查询语言”的功用吧。

转载于:https://www.cnblogs.com/ego/archive/2012/12/06/2804592.html

存储过程的优缺点个人总结相关推荐

  1. 存储过程的优缺点 (转载)

    为什么要用存储过程 几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问用没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没 ...

  2. oracle存储过程深入,深入了解oracle存储过程的优缺点

    定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是 ...

  3. 存储过程的优缺点_普洱紧压茶与散茶的优缺点

    被压制成形的普洱茶被统称为紧压茶,紧压茶是普洱茶最常见最普遍的形态,但并不意味这普洱茶就不能有散茶形式,可是普洱茶为什么要做成紧压茶呢? 这还是由普洱茶"越陈越香"的后发酵特性决定 ...

  4. SQL存储过程的优缺点

    概要: 存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它,也可以从另一个 ...

  5. 数据库存储过程之优缺点

    存储过程优点: 重复使用.存储过程可以重复使用,从而可以减少数据库开发人员的工作量. 减少网络流量.存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量 ...

  6. Oracle存储过程procedure与函数function区别

    定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程 带有参数)来执行它. 存储过 ...

  7. MySQL变量,存储过程,函数,流程控制详解(小白都能懂哦)

    1.系统变量 2.自定义变量 3.存储过程 4.函数 5.流程控制结构 1.系统变量 1.1系统变量的分类 系统变量:分为全局变量和会话变量 1.2系统变量的介绍 系统变量由系统提供,不是用户定义,属 ...

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

    点击上面"蓝字"关注,带你看好电影 菜菜哥,我新接手了一个项目,看的我头疼呀 业务有这么复杂呀? 不是的,这个老项目完全是用存储过程写的,每个存储过程都好几百行 这样呀,是够头疼的 ...

  9. mysql存储过程语法 if_mysql存储过程语法 if

    MySql存储过程 MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程, ...

最新文章

  1. 资源 | 100+个自然语言处理数据集大放送,再不愁找不到数据!
  2. ffmpeg-20160526-git-bin
  3. Linux文件读写机制及优化方式
  4. Java中生产者与消费者问题的演变
  5. NetDevOps — PyEZ
  6. php 时间 插件,PHP中Carbon日期时间处理利器详解
  7. 6.1 C/S 架构介绍
  8. 说说每月至少一次的那点事,文末有彩蛋!
  9. 2年工作经验进 初创公司_沟通是关键:通过两家初创公司获得的成长经验教训+找工作...
  10. hashmap put过程_看完还不懂HashMap算我输(附互联网大厂面试常见问题)
  11. 什么是决定计算机内部寄存器,问题解答之 计算机中寄存器定义,分类
  12. java 正则判断二进制_用正则表达式判断一个二进制数是否能被3整除
  13. jQuery ui widget和jQuery plugin的实现原理简单比较
  14. 基于卷积神经网络的微表情识别研究需要注意的一些问题【未完待续】
  15. COJ976 WZJ的数据结构(负二十四)
  16. xkcd目录_12条展示AI真相的XKCD片段
  17. Java 代码实现pdf转word文件 | 无损转换完整代码教程
  18. 浪潮java面经总结
  19. Visual FoxPro正式版
  20. .NET 通过Word模板,使用AsposeWord进行数据动态导出Word

热门文章

  1. Android Lint 原理及使用详解
  2. Git基础-删除文件 rm/git rm 命令详解
  3. 线性代数笔记14——行空间和左零空间
  4. 乱世女英雄--评程序员先驱霍珀
  5. An enum switch case label must be the unqualified name of an enumeration cons
  6. 全球直播 | 2022全球Xenomai社区大会揭露“阿凡达”背后的实时Linux内核
  7. WEB安全之:越权访问
  8. 数据与业务系列三,广告流量红利盛宴的终结
  9. 网络孙子兵法 黑客攻防也有三十六计
  10. 【前端开发】CSS BEM命名规范