最近系统上线,很多同事在讨论复杂的应用逻辑是不是应该写到存储过程里,发出了各种质疑...
开发人员觉得存储过程不利于工程化,具体来说可读性,扩展性都不够。而且不利于版本管理,团队协作。
DBA认为Oracle太贵,其他数据库存储过程优化差,所以把成本shift到应用软件里。
针对存储过程优缺点的争论由来已久,这里我们不妨来详细盘点一下存储过程的利与弊。
一、存储过程的优势
存储过程代码相对于SQL,复用、扩展、通用性都要更强!存储过程在后台数据库中运算,只要前端传参即可,所有的数据处理逻辑都写成存储过程,还有利于统一数据的出入口,易于实现数据权限管控!
总结一下,存储过程的优点主要来源于两方面:
1、SQL 的数据处理能力
至少目前来看结构化数据处理尤其是复杂计算,SQL 仍然比 Java 强很多。
2、库内计算的便利
数据不用出库省下的 IO 成本对数据密集型任务有莫大优势。
二、存储过程的缺点
传说阿里有一条军规,“禁止使用存储过程,存储过程难以调试和扩展,更没有移植性”。
1、并不是所有开发人员都熟悉怎么使用存储过程,包括像怎么用SQL表示各种复杂逻辑,怎么调试存储过程。
2、SQL是标准的,但存储过程以及控制逻辑,都是各家数据库自已的方言,不可移植到其它数据库。
3、存储过程也是代码,但却和代码分离开了,存储在数据库里。版本控制困难,进而造成从开发,测试,到上线整个流程的复杂度增加。
4、写JAVA代码的人和DBA通常是两波人,引来许多管理上的问题,如,数据库权限,两边人员打乒乓球。
5、工具支持不完善,不好调试(这点取决于用什么数据库)。
三、Oracle存储过程
现在互联网行业对存储过程的主流论调就喊打喊杀,存储过程难以调试、导致数据库压力增大、分布式环境不适应等等,实际上存储过程并没有这些毛病,错用存储过才会有这些毛病,大量用户进入,数据库出现性能问题,他们肯定会说,存储过程真垃圾,真不应该用,而实际上,并不是存储过程垃圾,而是用的人水平垃圾!用好Oracle存储过程真的很实用,尤其在数仓ETL调度、核心复杂应用逻辑,存储过程相当的稳定。
以下是使用Oracle存储过程规范
四、总结
简而言之,对于存储过程,只要使用关系数据库,就可以用它,无论是互联网应用还是非互联网应用,是MySQL还是sql server、Oracle,这些都不是影响使用存储过程的因素。但是不可滥用存储过程,数据的存储可以用存储过程,复杂的业务逻辑不应该由存储过程实现。一旦项目中出现大几十行甚至几百行的存储过程,就应该想法子优化了。
作者丨詹姆斯邦德007
来源丨公众号:IT邦德(ID:jeamesDB)
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn