读书人

相干存储过程-考虑很多

发布时间: 2012-11-21 08:23:26 作者: rapoo

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

【引用开始:】

???? 复杂的语句自然要放在存储过程中,虽然我反对乱用存储过程,但是如果你真的有一个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 这种纯面向对象对开发速度是一种极大的提高,性能上我估计人家也会尽量的优化。例如一级缓存,二级缓存。

?

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

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

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

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

很简单,不让换数据库.你见过哪个正常的系统没事去换数据库的. 8 楼 tianzaghi 2009-09-08 现在的项目全是存储过程...想不明白为什么要这么做。

难道是使用语言的原因? 9 楼 xixix2004 2009-09-08 写得很中肯。。但是也很苍白。。。

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

至于成本,我们公司是有专门的数据库人才的,每个项目组也都在培养数据库人才。值得不值得,那就仁者见仁,智者见智了。 10 楼 Frankie199 2009-09-09 程序有程序的用途,存储过程也有它的用处。
楼主说的过程里面只写一些INSERT UPDATE语句,当然没什么意义。
其实过程主要使用处理大规模的计算,比如社保项目里面计算待遇等,这个过程
有1000多行,如果方到程序里面也是不可能的。
还有大量的数据处理,比如扎帐需要处理所有人的支付计划等。这些不放到过程里面
也没办法。

其实我倒觉得过程要好调试一下,特别是Oracle,很好用。 11 楼 gwpking8419 2009-11-19 ironsabre 写道wangjia4202 写道我个人认为存储过程这东西能不用的话就尽量不用吧...
各种数据库的存储过程写法都不一样,万一更换或者添加数据库系统则会很麻烦,用程序写的话对数据库之间的差异考虑得少一点..

很简单,不让换数据库.你见过哪个正常的系统没事去换数据库的.

你在企业里面见过哪个系统是专门为一个客户打造的?当各户要求更换数据库时,你如何做? 12 楼 dieslrae 2009-11-19 insert,update,delete就不用写存储过程了?你没见过一个操作,要删除或者修改几十张表的情况吧,这个不写到存储过程里写程序里你去看? 13 楼 choijing 2009-11-19 业务的功能最好还是不要$封装在数据库,不然维护时确实头大 14 楼 winthesky 2009-11-20 我们系统几百万,上亿的数据量,把数据捞到中间件做业务处理,消耗是相当大,我们现在除了数据量小的业务在中间件做,其他一律都用存储过程处理,虽然很难调试 15 楼 kaneg 2009-11-21 Frankie199 写道程序有程序的用途,存储过程也有它的用处。
楼主说的过程里面只写一些INSERT UPDATE语句,当然没什么意义。
其实过程主要使用处理大规模的计算,比如社保项目里面计算待遇等,这个过程
有1000多行,如果方到程序里面也是不可能的。
还有大量的数据处理,比如扎帐需要处理所有人的支付计划等。这些不放到过程里面
也没办法。

其实我倒觉得过程要好调试一下,特别是Oracle,很好用。

现在写sql的人大多只是在那里堆砌业务,从来不考虑进行代码逻辑优化,动不动把sql写上千行好像是在炫耀一样,有必要吗? 16 楼 murainwood 2009-11-23 换数据库的事儿,虽然不常见,但还是有的。比如说手头系统里一堆的存储过程....唉...日子真难啊 17 楼 murainwood 2009-11-23 storm0912 写道使用存储过程要看针对什么样的数据库,譬如oracle就很好用。如果不用存储过程改用Dao来控制,事务的隔离是个挑战。oracle在数据库级别对事务的控制很好,使用存储过程就可以充分利用这一优势,将事务交给oracle去处理。

另外,LZ不用存储过程的一大原因,是觉得存储过程太vendor specific.但是对于大中型企业,一个项目上线以后,又有多少可能性去做database的switch.当然不排除小企业诸如前期使用mysql后期改用oracle,sybase.

题外话,LZ公司的程序员貌似干活还是比较卖力,就是不懂讨巧。做老大的就更应该提点一下,5天的活干3个星期,leader能没责任?这样就把人家fire掉,是不是有点...当然其他细节我不清楚,只是就事论事,LZ莫见怪!
可能性小不等于不存在,比如我遇到的什么“Oracle 到 DB2 战略迁移”这种稀奇古怪的事儿.
18 楼 Frankie199 2009-11-23 这种问题永远没有个答案,用不用试自己项目决定。
那种方便用哪种。 19 楼 hxy-go 2009-11-28 哪里有什么一劳永逸的设计,做应用,还是实际点好
特别做数据库应用,对不同的数据库,除非你使用十分简单的插入、删除、更新语句,可以方便的在各个数据库切换,不过数据库的特性就体现不出来了,把oracle,db2当mysql用了 20 楼 zjfzr1986 2009-12-15 还是那句老话 具体问题具体分析

读书人网 >软件架构设计

热点推荐