论坛首页 综合技术论坛

探讨用存储过程的优劣

浏览 84695 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-01-21  
lobbychmd 写道
ironsabre 写道
lobbychmd 写道
ironsabre 写道
lobbychmd 写道
存储过程只不过是预编译而已,能快到哪去啊?

效率多取决于代码的质量,对关系数据库的理解,不管用 sp 还是 orm 都是一样的。

说白了存储过程就是把标准 sql 这样一种经典的DSL,扩展为功能简单平淡无奇的解释运行的脚本语言, 表现能力有限,要复用和理解都不是那么容易。跟UI 的结合更没有一般的编程开发语言方便了。


sp快最主要的原因是:省掉了app server和db server之间的通信成本。
比如一个复杂的逻辑可能需要跟db交互100次,而如果在sp里,这里的100次通信成本就没了。


如果sp 可以实现那说明 这100 次交互是没那么必要的。
或者从另外的角度说 db server 承担了这些交互的一个变形,加重负担了


你明白我的意思吗?我说的是通信成本。而不是sql本身执行的成本。
这样可以帮助你理解,你现在假设app server和db server是通过56k的网速来连接的。
(这当然不是现实的,但这种把网速的慢放大可以帮助你理解通信成本。)
设每次app->db需要1秒通信时间,而db执行本身只需要0.01秒。
那么你需要花掉(1+0.01) * 100 = 101秒。
而使用pl/sql只需要1 + 0.01 * 100 = 2秒。

另外:db比有些人想像中的要强大很多。




主要是 db server 是不能 scale out 的,你如果找一个这么慢的网络来举例的话,囧,那我只能说还是看具体应用吧。 db server 做的事情单纯一些有利于系统的可伸缩性。


但很多人的db是不需要scale out,我知道的一些大保险公司的后台db也都是一台。这跟互联网企业不太一样。
我把网络调慢只是为了让网络通信成本显现出来。这是一个非常好的实验设计,没什么囧的。

就算在1000M网络的情况下,多次网络交互的时间在很多时候一样是需要考虑的。
一个是一次双机交互,然后直接N-1次本机。
一个是N次双机交互。
0 请登录后投票
   发表时间:2011-01-21  
ray_linn 写道
rox 写道
楼主可以买本Martin Fowler的《企业应用架构模式》仔细阅读一下。
和网友们说的类似,是否使用存储过程,应该依具体情况而定,但这本书讲的更全面和系统。
尤其在项目中,体会更深。
如果继续打算做java或.net开发,这本书必备。另外Martin Fowler其他的书也非常不错。



建议同时看一下<oralce高级编程>这本书,里面对sp讲述得很清楚。

据书评说翻译的很烂,是不是这样的呢?
0 请登录后投票
   发表时间:2011-01-21  
其实最主要就是看应用场景啦,一杆子打死永远都是错误的想法。
举个例子,你要是微博那样的,用存储过程,那会死得很难看。但如果是OLAP的话,用存储过程比在应用程序端去ORM什么的靠谱得多。
0 请登录后投票
   发表时间:2011-01-21  
非常的有道理,凡事都有两面性,我们将他的优点发挥出来,尽量规避他的缺点才是王道
0 请登录后投票
   发表时间:2011-01-21   最后修改:2011-01-21
为了追求效率与简单化,我也选择将业务逻辑放在存储过程中
较为核心的存储过程由比较熟悉业务的人来处理。
CURD等操作则使用自动化的……
0 请登录后投票
   发表时间:2011-01-23  
全部用存储过程,等于把业务层也要搬到数据库里,数据库端得承受多大压力啊。

其实最关键的,跨数据库麻烦的很,所有业务sql要重写。整天盯着看一串串的存储过程也挺恶心的。
0 请登录后投票
   发表时间:2011-01-23  
glovebx 写道
ironsabre 写道
lobbychmd 写道
ironsabre 写道
lobbychmd 写道
存储过程只不过是预编译而已,能快到哪去啊?

效率多取决于代码的质量,对关系数据库的理解,不管用 sp 还是 orm 都是一样的。

说白了存储过程就是把标准 sql 这样一种经典的DSL,扩展为功能简单平淡无奇的解释运行的脚本语言, 表现能力有限,要复用和理解都不是那么容易。跟UI 的结合更没有一般的编程开发语言方便了。


sp快最主要的原因是:省掉了app server和db server之间的通信成本。
比如一个复杂的逻辑可能需要跟db交互100次,而如果在sp里,这里的100次通信成本就没了。


如果sp 可以实现那说明 这100 次交互是没那么必要的。
或者从另外的角度说 db server 承担了这些交互的一个变形,加重负担了


你明白我的意思吗?我说的是通信成本。而不是sql本身执行的成本。
这样可以帮助你理解,你现在假设app server和db server是通过56k的网速来连接的。
(这当然不是现实的,但这种把网速的慢放大可以帮助你理解通信成本。)
设每次app->db需要1秒通信时间,而db执行本身只需要0.01秒。
那么你需要花掉(1+0.01) * 100 = 101秒。
而使用pl/sql只需要1 + 0.01 * 100 = 2秒。

另外:db比有些人想像中的要强大很多。



顶最后一句话,事实上很多人都把db仅仅当作是一个存放数据的地方。而由于对存储过程的不熟悉,一谈起存储过程就只想到编码麻烦、调试麻烦。


用悲观锁还是乐观锁跟用Java还是SP是没有直接关系的。简单来说,如果这个锁涉及到到一些长时间的停顿(例如IO、用户操作等),乐观锁比较合适;对于一些back end的批处理数据,悲观锁比较合适。
0 请登录后投票
   发表时间:2011-01-23  
存储过程的优势不是楼主说的那几点
存储过程的优势在于可以把复杂的数据处理,交给数据库服务做,程序不关心。
项目使用存储过程效果最好的是用DB2或Oracle,因为一旦使用存储过程,必然会使用游标和锁,数据库中处理锁最好的也就是DB2和Oracle了,mysql不清楚,sqlserver里用锁简直是“自杀”。微软不会处理锁。

高并发,取决于你的数据库承载能力,mysql要支持高并发必须进行集群设置,但你用了for update,如没有严格测试,高并发一定会有问题。高并发是for update不仅仅有“争用”,还有不同数据库行级别锁,表级别锁的问题。高并发数据库主要影响因素:锁的级别,数据文件的大小,索引的命中率,数据文件存储的方式,CPU轮转,硬盘I/O等。根据个人经验尽量别用for update。如果有锁的问题,最好采用“表锁”编程方式,比较合适。


0 请登录后投票
   发表时间:2011-01-23  
同一个业务的业务逻辑不要一部分写到java端,一部分写到sp,如果这样干就相当于拿榔头在维护人员的脑袋。

0 请登录后投票
   发表时间:2011-01-24  
fnet 写道
全部用存储过程,等于把业务层也要搬到数据库里,数据库端得承受多大压力啊。

其实最关键的,跨数据库麻烦的很,所有业务sql要重写。整天盯着看一串串的存储过程也挺恶心的。


大部分企业应用的业务层也都是基于数据库的,就算你表面上把逻辑都放在业务层,
最后实际的压力绝大多数一样被直接传导到数据库端。
你想想,你的所谓业务层里边,真正的逻辑计算用时多少,数据库操作用时多少。
基本上,绝大部分时间都是数据库操作用时。


天天考虑换数据库的话,那等于买个Oracle当mysql使了。
我做了这么多年金融核心系统,还没听过换过数据库。
从来就没有人在做系统的时候认为换数据库是一个需要考虑的可选项。

CRUD简单系统换数据库有可能,真正复杂的业务系统换数据库等于自杀。
CRUD的简单系统你本来也没有什么需要用到sp的地方。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics