论坛首页 Java企业应用论坛

有关存储过程--考虑很多

浏览 13030 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-17  

【引用开始:】

     复杂的语句自然要放在存储过程中,虽然我反对乱用存储过程,但是如果你真的有一个sql语句长达百行,那不放在存储过程中才是有毛病呢。


      首先什么事情不能极端,不是说反对用存储过程就一个存储过程都不用。
另外还要从成本考虑,就像作者说得,专门有个人来写存储过程,那你要看什么公司了,项目预算了,如果你做下来是赔本的,那么代码写的再漂亮有什么用呢?


      记得在teched2005上郭安定老师问过一个问题:什么是最好的开发工具? 有回答VS.net2005的,有回答好用的。
郭老师的答案: 能赚钱的开发工具就是最好的开发工具

      你做项目为了什么?如果你不是为了利益,比如一些开源项目,那么你完全可以精雕细琢。但是如果你是做一个产品做一个项目,那么你要记住最终目的,就是要有利润。

我认为存储过程有如下问题:1:难于维护。2:难于调试
如果只是简单的insert /update/delete,都封装成存储过程,那确实不是一个好的设计。
如果是复杂的sql 语句,放到存储过程中未尝不可。
也就是,反对滥用。

      原来在我手下的一个程序员,交给他一个很小的系统,实际上5天就写完了。结果他写了3个星期,问题就是他层分得太多了,存储过程一大堆,一层层包 装,而实际上快速开发几天就可以搞定,而且当客户需求有些更改的时候,他需要改动的时间也很长,几千块的项目,基本就赔本了。这个人也只好炒掉了。

      其实我相信这个程序员的能力,但是我不赞成这个程序员的死板,优秀的程序员能够审时度势来确定采用哪种方法。而不是所有的项目都采用一种方法。
 【:引用结束】

 

      不同数据库的存储过程写法不一样,如果要兼容不同数据库,那最好就不用存储过程,因为你要维护两套岂不是很头疼。

 

【引用开始:】

       偶也不赞成使用存储过程.原因:

1,复杂的SQL查询可以在采用OO很好的封装--与其在数据库端封装,不如采用专门的DAO层封装,通过OO方式来管理复杂    性 比过程式的管理要来的好.从上一层看来,也更清晰.

2,存储过程带来的预编译优势并不是很大.数据库的性能主要还是靠好的设计,索引,缓存等机制来提高.

3,存储过程导致数据库厂商锁定,这是非常不好的.

 

【存储过程有好处的确,但抓问题要抓主要矛盾,这些好处是你的性能瓶颈吗?这才是优化的唯一出发点】


我比较认同! 最起码SQLServer存储过程带来的预编译优势真的不是很大(我甚至看不到),数据库的性能主要还是靠好的设计,索引,缓存等机制来提高.

另外我发现没人提到稳定性的问题,我在多个项目中遇到过,SQLServer存储过程不稳定,或者说SQLServer整个系统不稳定.
以下情况是我遇到的:
1: 某个事务中如果包含多个存储过程(如10个,其实每个都是简单的INSERT,UPDATE等操作),不稳定,调试的真TMD辛苦啊,最后去掉存储过程,才一切OK.
2: 我一直认为SQLServer系统的整体调度还是有问题,某电信项目是24小时不停机处理海量数据,在调用大量存储过程的前提下,一般过2到3天服务器就当机,后来进行了主要是包括去掉存储过程的操作后基本能长阶段运行.

大系统,选择SQLServer还是不妥.

【引用结束:】

 

 

 

【最后:】

     首先软件的分层是为了更好的解耦:

 

     数据库的用途就是存放数据,程序才是处理挖掘数据的工具,把业务的功能封装在数据库里成存储过程是换来了性能的一点提升,但本身是违背软件的设计原理的,但好还是不好,我们都不要绝对,从cost 出发考虑问题,客户第一,效益最大。回过头继续聊,打个比方,一个电脑或者专业点的大型机器,预装有基本的动作,我可以拿它买给n多客户而不需要更改任何东西,这是最好的做法,但如果有客户需要你特制一些功能在里面,那么这太机器就耦合了该客户的一些业务了,当然了对这个客户来说性能上绝对是大提升,但对于制造方要花人员去维护了。

 

     O/R mapping 对象关系映射, 如heibernate 这种纯面向对象对开发速度是一种极大的提高,性能上我估计人家也会尽量的优化。例如一级缓存,二级缓存。

 

    总结:我做程序比较注重程序的可读性,也许是我维护别人的代码怕了,所以尽量把自己知道的全部注释上去,这中做法很多情况恰恰是帮了自己。如果是我带队,我绝对不用存储过程,总觉得用存储过程的是人还是少,做好的程序,让别人来维护,除了代码外,他还需要面对一对数据库里的过程,他会头大的。

   发表时间:2008-12-17  
在考虑到效率因素的话,存储过程还是有很大必要的。再说,存储过程不是也可通过注释、文档和适当的写法表现在程序中。存在即合理。我觉得存储过程还是考虑效率和安全时候的一个方式。
0 请登录后投票
   发表时间:2008-12-22  
xleon 写道

在考虑到效率因素的话,存储过程还是有很大必要的。再说,存储过程不是也可通过注释、文档和适当的写法表现在程序中。存在即合理。我觉得存储过程还是考虑效率和安全时候的一个方式。

好多论天里的朋友都提到过存储过程的效率提升问题,很微不足道的
0 请登录后投票
   发表时间:2008-12-22  
个人觉得  如果滥用存储过程在系统群集的时候 会碰见很大的麻烦。
0 请登录后投票
   发表时间:2009-06-18  
很可能在上千万的项目
你看到的就是一堆一堆的SQL
0 请登录后投票
   发表时间:2009-06-18  
存储过程带来的预编译优势并不是很大.数据库的性能主要还是靠好的设计,索引,缓存等机制来提高.

--- 这个比较法明显有问题,要对比预编译和非编译的区别,当然是基于相同的数据可设计,否则有什么可比性。
0 请登录后投票
   发表时间:2009-06-18  
我个人认为存储过程这东西能不用的话就尽量不用吧...
各种数据库的存储过程写法都不一样,万一更换或者添加数据库系统则会很麻烦,用程序写的话对数据库之间的差异考虑得少一点..
0 请登录后投票
   发表时间:2009-07-16  
wangjia4202 写道
我个人认为存储过程这东西能不用的话就尽量不用吧...
各种数据库的存储过程写法都不一样,万一更换或者添加数据库系统则会很麻烦,用程序写的话对数据库之间的差异考虑得少一点..


很简单,不让换数据库.你见过哪个正常的系统没事去换数据库的.
0 请登录后投票
   发表时间:2009-09-08  
现在的项目全是存储过程...想不明白为什么要这么做。

难道是使用语言的原因?
0 请登录后投票
   发表时间:2009-09-08  
写得很中肯。。但是也很苍白。。。

针对一些特定的项目,如电信方面的,存储过程是有它存在的必要的。

至于成本,我们公司是有专门的数据库人才的,每个项目组也都在培养数据库人才。值得不值得,那就仁者见仁,智者见智了。
0 请登录后投票
论坛首页 Java企业应用版

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