论坛首页 综合技术论坛

探讨用存储过程的优劣

浏览 84571 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-01-20  
如果都是对数据库有经验的,可以用存储过程;新手别写低效的sql就行
0 请登录后投票
   发表时间:2011-01-21   最后修改:2011-01-21
存储过程只不过是预编译而已,能快到哪去啊?

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

说白了存储过程就是把标准 sql 这样一种经典的DSL,扩展为功能简单平淡无奇的解释运行的脚本语言, 表现能力有限,要复用和理解都不是那么容易。跟UI 的结合更没有一般的编程开发语言方便了。
0 请登录后投票
   发表时间:2011-01-21  
我们有个项目,逻辑全在存储过程中。。
0 请登录后投票
   发表时间:2011-01-21  
liangguanhui 写道
xiaoshan5634 写道
使用存储过程的优点:
1.开发速度非常快,基本上一个增删改查一个小时就能搞定
2.可以实时的更新业务逻辑代码不需要重新编译java代码,对于业务逻辑经常变的系统这点很有帮助
缺点:
1.数据量大时,对数据库的压力就非常大
2.对于热门资源访问量较大,容易形成堵塞,若存储过程写的不好,容易产生死锁。web层可以很容易无限的横向扩展,但数据库就只有一个,一但数据库堵塞了,整个系统也就差不多要挂掉了。使用存储过程会增加数据库服务器的负担。

我们公司就是将业务都写在存储过程里,现在经常都会堵塞,快要下班时系统就很慢。我们想了很多办法,将使用非常频繁且对数据库有压力的查询使用Lucene来完成。页面静态化,减少用户对数据库的访问。现在数据库的压力还是无法释放,正考虑换sql server2008,能将数据库的内存加到12G,可以缓解一点数据库的压力。


+1

其实SP还有一个很重要的功能:统一API。有时候一个数据库不仅仅就一个应用在操作,例如一个系统,它有web平台(Java),也有本地的CS平台(.NET)。这个时候就可以使用SP统一API。

当然,这种情景,你甚至可以用上一些中间件,例如ICE之类的。

SP有一个比较明显的缺点:部署的时候的版本控制比较麻烦。


为什么会有版本控制问题?版本控制跟java有什么区别?
0 请登录后投票
   发表时间:2011-01-21  
lobbychmd 写道
存储过程只不过是预编译而已,能快到哪去啊?

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

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


sp快最主要的原因是:省掉了app server和db server之间的通信成本。
比如一个复杂的逻辑可能需要跟db交互100次,而如果在sp里,这里的100次通信成本就没了。
0 请登录后投票
   发表时间:2011-01-21  
xiaoshan5634 写道
liangguanhui 写道
xiaoshan5634 写道
使用存储过程的优点:
1.开发速度非常快,基本上一个增删改查一个小时就能搞定
2.可以实时的更新业务逻辑代码不需要重新编译java代码,对于业务逻辑经常变的系统这点很有帮助
缺点:
1.数据量大时,对数据库的压力就非常大
2.对于热门资源访问量较大,容易形成堵塞,若存储过程写的不好,容易产生死锁。web层可以很容易无限的横向扩展,但数据库就只有一个,一但数据库堵塞了,整个系统也就差不多要挂掉了。使用存储过程会增加数据库服务器的负担。

我们公司就是将业务都写在存储过程里,现在经常都会堵塞,快要下班时系统就很慢。我们想了很多办法,将使用非常频繁且对数据库有压力的查询使用Lucene来完成。页面静态化,减少用户对数据库的访问。现在数据库的压力还是无法释放,正考虑换sql server2008,能将数据库的内存加到12G,可以缓解一点数据库的压力。


+1

其实SP还有一个很重要的功能:统一API。有时候一个数据库不仅仅就一个应用在操作,例如一个系统,它有web平台(Java),也有本地的CS平台(.NET)。这个时候就可以使用SP统一API。

当然,这种情景,你甚至可以用上一些中间件,例如ICE之类的。

SP有一个比较明显的缺点:部署的时候的版本控制比较麻烦。

完全同意你的观点,版本控制确实比较麻烦,现在我们是每次修改完成的时候都保存为文件,然后将其上传都SVN,这样就人为的做到了版本控制。


你们在说什么?难道你们原来sp不放在版本控制软件里吗?好奇怪啊。
你java怎么控制sp就怎么控制版本,哪来的麻烦,给我说清楚。
0 请登录后投票
   发表时间:2011-01-21  
seya 写道
把业务逻辑写到存储过程,是种很不好的实现方式。因为一般随着业务的增大,逻辑的复杂,性能会逐渐下降,后面你会发现MySQL已经无法满足你的需求,得换Oracle或者SQLServer, 或者做一些迁移,集群之类的,一般需要改变的都是数据库,而不是前端或者服务器Java代码,这样你那些写在数据库里面的东西都得改,数据库写的越多,工作量越大。


我见过的逻辑复杂的超大业务系统都喜欢用存储过程。
0 请登录后投票
   发表时间:2011-01-21  
liangguanhui 写道
ray_linn 写道
govista 写道
我的理解:
1.对于逻辑密集型的业务系统,比如上面提到的进销存,用存储过程的开发效率至少是用JAVA开发的5倍以上,至于说性能,这个和语言的关系不大,关键在对SQL语句的优化。
2.存储过程学习成本很低,新人培训3天可以直接上手,当然,前提是对业务逻辑比较熟练(话说回来,一个对业务逻辑不熟练的人,什么语言高手都不管用)。
3.一行一行敲代码的程序员们,如果要进步快点,可以多花点时间,换换脑子,多理解理解业务吧,别在这讨论这个语言那个语言的。


回看楼主:

高并发下,不知道会不会有问题。完成一个业务过程,牵涉到许多表和好几个存储过程,里面有好几处是FOR UPDATE。设计时已经考虑到死锁问题,所以对多张表的更新顺序是保持一致的。但是高并发情况下会不会有性能问题,目前还未测试。如果有谁有经验,还望不吝赐教。

----------------------

这么多不确定能证明存储过程学习成本很低么?


难道你这些FOR UPDATE,你换成Java就不再需要了吗?要锁的表,用哪种方法还是要锁的……


这句话对头,这跟用什么语言没有任何关系。
我见过有人做企业开发很多年了,连select for update是干什么的都不知道。
0 请登录后投票
   发表时间:2011-01-21  
用百度。是因为google退出中国市场
0 请登录后投票
   发表时间:2011-01-21  
ironsabre 写道
lobbychmd 写道
存储过程只不过是预编译而已,能快到哪去啊?

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

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


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


如果sp 可以实现那说明 这100 次交互是没那么必要的。
或者从另外的角度说 db server 承担了这些交互的一个变形,加重负担了
0 请登录后投票
论坛首页 综合技术版

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