问答详情
源自:3-2 秒杀操作-并发优化-2

使用存储过程是否值得?

您好,我看阿里规范里建议弃用存储过程,然后面试的时候也说了存储过程过时了,所以想请教下过时的原因,这里使用存储过程所得到的优化和产生的坏处相对比来说是否值得?

提问者:慕丝9183733 2018-06-08 22:41

个回答

  • qq_逆时针_1
    2018-06-24 10:46:57
    已采纳

    优点:

    1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
      2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
      3.存储过程可以重复使用,可减少数据库开发人员的工作量。
      4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

    缺点:

    1.   运行速度:   大多数高级的数据库系统都有statement   cache的,所以编译sql的花费没什么影响。但是执行存储过程要比直接执行sql花费更多(检查权限等),所以对于很简单的sql,存储过程没有什么优势。     
      2.   网络负荷:如果在存储过程中没有多次数据交互,那么实际上网络传输量和直接sql是一样的。     
      3.   团队开发:很遗憾,比起成熟的IDE,没有什么很好存储过程的IDE工具来支持,也就是说,这些必须手工完成。     
      4.   安全机制:对于传统的C/S结构,连接数据库的用户可以不同,所以安全机制有用;但是在web的三层架构中,数据库用户不是给用户用的,所以基本上,只有一个用户,拥有所有权限(最多还有一个开发用户)。这个时候,安全机制有点多余。     
      5.   用户满意:实际上这个只是要将访问数据库的接口统一,是用存储过程,还是EJB,没太大关系,也就是说,在三层结构中,单独设计出一个数据访问层,同样能实现这个目标。     
      6.   开发调试:一样由于IDE的问题,存储过程的开发调试要比一般程序困难(老版本DB2还只能用C写存储过程,更是一个灾难)。     
      7.   移植性:算了,这个不用提,反正一般的应用总是绑定某个数据库的,不然就无法靠优化数据库访问来提高性能了。     
      8.   维护性:的确,存储过程有些时候比程序容易维护,这是因为可以实时更新DB端的存储过程,但是在3层结构下,更新server端的数据访问层一样能实现这个目标,可惜现在很多平台不支持实时更新而已。 


  • 海耶森斯
    2018-08-17 14:19:38

    存储过程还是不行啊,我做压力测试的时候,500个商品,用500个线程去抢,一半左右的线程会出现错误,不用存储过程,只有20个左右的线程会出现错误。而且响应速度也特别慢。不过redis缓存和行级锁优化是确实非常厉害,我用了学校实验室的两台台式机进行部署和测试,mysql,redis,tomcat集中在一台机器上,另一台跑jmeter测试,同样是500个线程500个商品,优化前跑完需要13s,优化后跑完需要7s,最大tps也提升了一倍