随笔 - 31  文章 - 1 评论 - 185 trackbacks - 3
<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

欢迎访问我的非技术博客:
http://Moosdau.blog.163.com

与我联系

搜索

 

常用链接

留言簿(3)

随笔分类(30)

随笔档案(31)

最新评论

阅读排行榜

评论排行榜

[2007.10.31修改本文]
最近与同事在存储过程的问题上发生严重的分歧了.

他认为程序中几乎不应该出现sql 语句, 所有的访问数据库的动作, 都应封装成存储过程. 而我不喜欢存储过程, 不到万不得已, 我不会使用存储过程.

我的想法:
<1>效率.
<1.1>先考虑简单sql 语句, 所谓简单, 比如只有一个select/update/insert/delete 语句, 对简单sql 语句来说, 与存储过程的差异在哪里呢, 存储过程只是预先编译过了, 也就是说, sql语句的执行时间=编译时间+ 执行时间, 而存储过程只有执行时间, 没有编译时间. 而两者的执行时间应该是一样的, 对于简单sql 语句来说, 编译时间非常小, 可以忽略不计, 虽然没有确切的数据, 不过我认为我的这个推断应该没有什么问题. 也就是说, 从效率上讲, 简单sql 语句与存储过程没有什么区别.  我用过各种各样的简单sql语句测试, 这其中也包括链接十几张表的复杂查询, 执行时间跟存储过程没什么差异.
<1.2>复杂sql语句段. 要声明一下, 我认为很长, 譬如几十句, 甚至上百句的sql 段根本不应该存在. 因为比较长的sql语句段一定会包含许多"逻辑" 处理, 而不是"数据" 处理, 举个简单的例子, 像left 这样的字串操作函数, 我觉得根本不应该出现在sql 语句中. --------在服务器中, 数据库服务器是压力最大的服务器, 也是最关键的服务器, web 服务器相对来说压力就小得多, 同等的工作, 应该优先考虑由web服务器来负责, 而不应该转嫁给数据库服务器. 另外, sql 语句虽然经过编译, 但是在类似left 这样的函数处理能力上, 比由C# 这样的高级语言的处理能力还是差得多(这一点不需要证明吧...) , 所以, 我认为所有的逻辑判断, 业务处理, 都应该由高级语言处理, 而sql 语句只处理数据, 这样也可以保证将数据库服务器的压力降到最小.  这一观念的推论, 就可以得出, 长长的sql 段是要不得的, 虽然存储过程擅长sql段, 但是我的程序会保证总是提交给服务器简单sql 语句.

<2>安全性.
提到存储过程, 就会常常提到它对用户的分隔能力, 可是在我参与过的三四个大型项目来看, 这种能力几乎毫无用处, 至少在我所参与的ERP 项目中, 它是毫无用处. 因为最终用户根本不会, 也无需, 也不可能去了解数据库层的东西, 他们只是要求打开一个页面, 可以展示一个报表, 或操作数据, 或完成某个流程等, 实际上, 即使使用存储过程, 在程序中也总是以某一个高权限用户去访问所有的存储过程.

<3>可扩展性.
从这个角度来说, 存储过程就处于完全没有竞争力的地步了. 一个页面很可能会发展变化, 但是每次升级都改动存储过程显然是一件危险的事, 事实上, 一个存储过程一旦写完投入使用, 就很少有人敢去改它. 而sql 语句则可以任意的升级,变化.

<4>可管理性.
由于任何一个项目在其漫长的生命期中都很难预测它到底会膨胀到多大, 所以存储过程的数目也会急剧地增加, 几百个存储过程是很稀松平常的事, 大型项目的存储过程达到几千个一点也不夸张, 如许多的存储过程, 要管理并记清楚每一个存储过程所完成的工作, 实在不是一件容易的事. 尤其是, 写这个存储过程的人离职后, 新来的人多半会被大量的存储过程难倒.

<5>我个人认为使用存储过程很麻烦, 远不如sql语句来得方便.

<6>借助于将表映射成类, 可以很好的支持表结构改变, 这主要是针对从零开始开发, 因为在第一次设计中, 不可能将数据库的结构设计得一次到位, 如果到了后期修改表结构, 所有的旧引用都是运行时错误, 而类型化的sql 语句则会变成编译时错误, 只要全项目替换一下就可以了.

因此, 我的结论是,
<原则1> 只有在很复杂, 需要大量的sql语句时, 才应使用存储过程.
<原则2> 应把所有逻辑处理转移到web服务器, 除极少数特殊情况外, 不应使用sql段.
根据这两个原则, 就很少会有使用存储过程的机会了.

但是, 由于对存储过程缺乏更深入的理解, 所以我对上想法也并没有太大的把握 , 在网上查了不少东西, 也罕有有用的文章, 多半是隔靴搔痒, 或是给新人看的, 或是语焉不详, 一笔带过, 所以就先贴在这儿, 大家在扔砖头之余 , 希望能详细地谈谈这个问题, 也好有个确定的答案.



看了大家的评论, 既有收益, 还是有点无奈, 与我现在面对的状况基本一样, 大家的观点也分成两派, 而且看起来人数也相当, 不过好几位一面倒认为应该使用存储过程的兄弟, 都是"唯心" 式地认为存储过程就是好, 效率就是高, 或者不加说明的下结论, 呵呵, 我觉得这种观点对别人的帮助就很小了, 可能是懒得打字吧.
针对大家的回复, 我再谈几点我的看法.
首先声明, 我是做ERP 的, 系统运行在内网, 公司的网络设施也很好, 所以网络传输部分的代价几乎可以忽略,
另外, 项目的源代码有80多MB(不含图片), 有四五家分公司, 数万人使用, 数据量之大不用说了,当然, 维护也是我们. 有专门的DBA, 但是他很少会管存储过程, 存储过程主要是由我们的项目经理写的.  
我觉得这种环境应该是比较典型的, 写公网上的系统的人应该不会很多吧?

to:@Happiness is enough(21楼)
你说的比较详细也比较中肯, 不过, 你说"没有任何理由可以说明一个project中的成百上千个类和方法不会带来灾难."  这句话我无法认同.  不要说成百上千个, 在.net framework中, 类和方法不止上万吧, 可是也没有带来灾难. 因为类可以按它的用途等等进行层层归类, 而方法封装进类中, 如果这种结构设计得好的话, 即使数量很多,也很容易管理. 另外, 借助于IDE 的智能感知, 以及XML 注释的威力, 我们也无需背下来这些类和方法的名字, 用的时候看一下就可以了. 而存储过程就没办法进行这样的管理.
@koenemy(37楼)
说"你在告诉你同事,,不是几乎,应该是根本,访问数据库的方式要一致。" ,
这句话的后半句我很赞同, 而且事实上几乎必须这样操作, 虽然说, 有的情况比较适合用存储过程, 有的情况比较适合用嵌入式语句, 但是, 在项目的管理上来说, 除非极少数的特殊情况要求, 否则应该用一致的方式来操作, 这也是我觉得为什么一定要在这两者之间挑一个出来作为"主力" 的原因. 因为在项目中还有很多"模棱两可" 的情况, 必须有一个优先的选择.

没有永恒的事
一切都在不断重复
我热爱这个世界
但绝不骄纵了它
posted on 2007-10-30 13:59 木刀 阅读(4822) 评论(81)  编辑 收藏 所属分类: asp.net 点滴

FeedBack:
#1楼  2007-10-30 14:04 Jeffrey Zhao      
很多东西还是经验上的。
比如有些逻辑还是很适合在存储过程里出现。
  回复  引用  查看    
#2楼  2007-10-30 14:15 wuye [未注册用户]
同意楼主的看法 但是复杂操作比如费时间的操作还是放到存储过程里面好 其他的还是sql语句好
  回复  引用    
#3楼  2007-10-30 14:17 qq13237810775      
同意
  回复  引用  查看    
#4楼  2007-10-30 14:19 Jeffrey Zhao      
@wuye
为什么费时操作应该放在存储过程里呢?
  回复  引用  查看    
#5楼  2007-10-30 14:20 Jeffrey Zhao      
还有就是我们有时候会忽视了一点——这和我们平时做的东西的性质有关。
数据库其实是一个系统程序,也是作为软件架构中的一层,对于有的应用,数据库就是为上层应用在做开发,而无论存储过程,视图都成了对外的接口。
而我们现在往往只是把数据库作存储而已。
  回复  引用  查看    
#6楼 [楼主] 2007-10-30 14:24 木刀      
@Jeffrey Zhao
是的, 我参与的项目里都没有对外公开存储过程/视图 等的, 如果要公开, 那么区分用户就非常重要了.

@Wuye
同问, 耗时的操作耗的是执行时间, 磁盘IO 有那么多, 不论存储过程还是内嵌语句都偷不了懒, 为什么要放存储过程?
  回复  引用  查看    
#7楼  2007-10-30 14:32 没剑      
我觉得还是应该“具体问题具体分析”
周星星同学的电影里不是说“就算是一张卫生纸,一条内裤也是有它们的用处的”
存储过程存在一定是有它的道理的,复杂点的一些操作,或者说是动作比较紧凑的操作,放在存储过程中还是很合适的。
  回复  引用  查看    
#8楼  2007-10-30 14:45 future001 [未注册用户]
支持!和我想的做的完全一样!
  回复  引用    
#9楼  2007-10-30 14:49 鼠标王 [未注册用户]
全部都用存储过程来实现是不可取的,记住一点,存储过程只不过是一条或者多条sql语句拼起来的一个东西而已。多条时候使用更多而已。

具体情况具体分析。
  回复  引用    
#10楼  2007-10-30 14:55 kiler      
他认为程序中几乎不应该出现sql 语句, 所有的访问数据库的动作, 都应封装成存储过程.

鬼扯,我觉得除非是性能需要,否则不用存储过程。
那么多存储过程对于部署开发都是噩梦。
  回复  引用  查看    
#11楼  2007-10-30 15:31 永红      
非常赞成楼主的观点,而且我就是这样做的。
不过,有一次我去面试(该公司在国内ERP行业中应该是响当当的)的时候,那个面试官却认为我不会写存储过程,所以用这样的回答来敷衍他。很是郁闷。
  回复  引用  查看    
#12楼  2007-10-30 15:33 oldmoon [未注册用户]
问题不应该绝对化,看需要吧!
关于left这样的处理我还是比较习惯在数据库中处理,至少可以减少数据传输的压力
  回复  引用    
#13楼  2007-10-30 15:35 永红      
在Sql Server中, 对于参数花的Sql语句,和存储过程相比,在速度上,除了在第一次的时候因为需要编译而需要花费时间外,在其余的时候,应该是一样的。
  回复  引用  查看    
#14楼  2007-10-30 15:38 jisen      
用不用存储过程要根据实际情况,有些存储过程(包括数据库其他对象如触发器和游标等)是有必要采用的,由于大家平时都比较侧重代码,可能忽略了数据库开发重比较好比较高效的东西,个人觉得存储过程多并不是噩梦,看你怎么对数据库实施过程进行管理,没有管理好,后期的数据库维护和修改就是噩梦,管理好了,一切都会迎刃而解。
  回复  引用  查看    
#15楼  2007-10-30 16:08 Jack Niu      
不同意楼主的观点,但我实际上确是和楼主一样的做法。
原因在于我们对存储过程的不甚了解,了解清楚,当你变成存储过程的高手时,你才会发现他的好处。(打算抽时间研究存储过程了,只是没有时间~~~~)
  回复  引用  查看    
#16楼  2007-10-30 16:11 韩现龙      
同志们可以试一下一个有20万条数据的表用执行SQL语句和执行存储过程会有什么区别。
存储过程在SQL SERVER中还是非常之高效的。
不过对于某些同志说的也不错,如果只是做一个简单的小系统来说,我们只需要去实现它的功能就可以了,而无需去考虑它的性能时就可以直接使用SQL语句来对数据表进行操作。可一旦要涉及至性能,我希望大家考虑一下使用存储过程。

前一段时间本人做的一个在线招聘考试系统,答题部分用Ajax来实现,每答一题用户就保存一下。这样的话,单纯的使用SQL语句和使用存储过程来处理的效率差异至了一倍以上。
  回复  引用  查看    
#17楼  2007-10-30 16:12 活靶子 [未注册用户]
如果你的SQL语句是嵌入到 编程语言内的,那就谈不上“而sql 语句则可以任意的升级,变化”了
  回复  引用    
#18楼  2007-10-30 16:35 古巴 [未注册用户]
对于楼主的“可扩展性”这点不是很赞同。比如提供一个id得到一条记录,以前是3个字段,现在要5个字段,写sql就得重新编译程序,而存储过程的修改对程序本身就没影响,所以我觉得刚好和楼主说的是相反的。

另外,我个人认为效率什么的都是其次,因为在程序和数据库的基础设计都没重大失误的情况下,对于同一个逻辑,一般来说执行sql还是存储过程的效率差距应该不太大,对于现在的服务器硬件来说,可以不怎么考虑了。但关键是使用存储过程会导致业务逻辑分散在应用程序和数据库两边,不太便于维护,所以我个人还是习惯用ORM处理这些数据库的操作,而业务逻辑由应用自己处理,只在一些特殊情况下使用存储过程。总之,合理运用,没高低之分。
  回复  引用    
#19楼  2007-10-30 16:48 Clark Zheng      
我支持使用存储过程,包括查询和数据操作,这样可以由专职的DBA来保证执行效率,并且对于数据库访问的权限也可以有更好的管理,部署和可维护性是相对来说,如果有专职的DBA不会发生有人离职后,该存储过程难倒后来人的情况,另外如果程序本身维护不好,一样会发生这样的情况(恐怕每个人都有被接手过来的程序放倒的体会吧)
  回复  引用  查看    
#20楼 [楼主] 2007-10-30 16:50 木刀      
@韩现龙
这个, 我不认同, 我绝对相信你看到的时间差, 但是, 同样的语句, 我每次执行得到的时间都不一样, 差别可以达到近十倍, 而且, 如我在文中所说, 存储过程跟普通语句之间的差异只是差别在编译时间, 对于编译后的sql 语句来说, 其执行时间应该等同于存储过程 , 跟表的规模没有关系.

@古巴
你说的确实有道理, 不过对于一次升级来说, 虽然理论上可以认为只改一下存储过程就行了, 但是实际上基本不可能只改那一点, 一定会有附带的其它东西要改, 所以重新编译程序在所难免, 我所指的扩展性好, 主要是基于存储过程可能会被多个页面所调用, 这样修改起来风险会很大, 因为改的时候很可能记不清到底有哪些页面调用了这个存储过程, 尤其是在公司里人员变动时, 后来的人基本上不敢轻易改以前的存储过程, 害怕会对其它部分有影响.

另外, 通过在程序中把表映射成类, 可以很好地把sql 语句类型化, 这样如果表结构发生变化, 只要更新映射, 就可以把所有的旧引用变成编译时错误, 而不会是运行时错误. 这也是一个极其重要的原因. 存储过程把表结构焊死了.
  回复  引用  查看    
#21楼  2007-10-30 17:06 Happiness is enough      
自己也从事数据库开发好多年了,对楼主的话题很感兴趣,也想从楼主考虑的几个方面发表一下个人的想法:
一、效率
对于简单的SQL(比如select * from tb)语句,封不封装成存储过程在性能上不会有太大影响,因为简单嘛,编译时间几乎可以忽略。对于较复杂的语句,封装成存储过程固然能提高程序的效率,但我们可以想像一个简单的场景:一个系统操作需要用户等待30秒左右的时间,封装成存储过程如果能够提高5秒的话,进度条的开发会相当困难,而使用嵌入SQL的话,虽然时间会长一些,但可以很容易地开发出用户进度提示,大家做为用户会更喜欢哪种操作呢?

二、安全性
个人认为不论是嵌入SQL还是封装成存储过程,与安全没有多大关系。

三、可扩展性和可维护性
编程语言特别是现在的高级语言主要是立足于程序的功能实现和变化适应的,所以比存储过程的开发有先天的优势,所以我们认为从可扩展性和可维护性角度来说,嵌入SQL比存储过程有较大的优势。但存储过程比高级语言的优势在于它不需要发布,修改完后即可直接运行,这一点为我们开发项目带来的好处就不言而喻了。

四、可管理性
首先承认存储过程的版本管理、配置管理等等确实没有编程语言易于实现,但现在的各种管理工具已经发展到可以对数据库进行配置了。另一方面,如果一个数据库中的成百上千个存储过程会带来灾难的话,没有任何理由可以说明一个project中的成百上千个类和方法不会带来灾难。

五、个人观点
我们从存储过程的定义可以看出,DBMS提供商为我们提供存储过程是用来存多个SQL语句的,至于说这些SQL语句的复杂性和关系,是由使用者来控制的,甚至使用不使用存储过程,也是个人或团队的自由,没有严格的标准限制。高级程序亦如此。


  回复  引用  查看    
#22楼  2007-10-30 17:07 戒焦戒躁      
我觉得最关键的一点是,非常频繁的数据操作应优先考虑存储过程,而用得不多的,就用SQL语句就行了。比如,一个产品展示的页面,每一个用户打开时都会导致数据读取操作,而一个系统选项设置的页面,通常只有管理员很久才会打开一次。
  回复  引用  查看    
#23楼  2007-10-30 17:09 surrey [未注册用户]
我是用SQL比较多,我是这样区分的,一般涉及到事务,或者是一连串操作的过程时候就用过程,其它时候都用SQL,我还是喜欢SQL,调试方便,当然不是说过程不方便,不过用SQL比较多

www.developer365.net
  回复  引用    
#24楼  2007-10-30 17:47 wood [未注册用户]
存储过程带来的性能提升个人以为实在有限,反而它带来的问题要比好处大得多。
非常频繁的数据操作就要使用存储过程,这实际上是一种思维误区。
同样的SQL语句,以存储过程的方式执行和以嵌入SQL执行的效率差别仅仅只是SQL的编译时间,相对于数据操作的时间,基本可以忽略不计。
存储过程在当年C/S结构系统兴盛的时代,确实是一门有用的技术,它能够将业务逻辑集中到数据库,部分减少部署成本。然而时至今日,通过B/S结构系统,远程调用等手段已经足够解决这种问题,实在看不出存储过程继续存在的必要。
基本支持博主的观点。
  回复  引用    
1、存储过程可以很方便的处理事务,就是一次添加多条记录,要保证这些数据的完整性,用存储过程还是很方便的。

2、批量添加数据的时候,存储过程会更快一些。
以前做过一个从文本文件读取IP地址信息,然后加到数据库的代码。
用sql的时候很慢,用存储过程就快了1到2倍。可能并不是太准,因为还作了一下IP格式转换的操作。

3、无论什么,多了都是不好管理的。
无论是存储过程、视图还是程序里的SQL语句,多了就不好维护。怎么维护、管理、升级这些咚咚才是最重要的!


4、不要一刀切
该用什么就用什么,好钢用在刀刃上。


  回复  引用  查看    
#26楼  2007-10-30 18:29 S.Sams      
把业务逻辑写在数据库里面, 维护相对比较方便.不用改程序.
至于性能其实还是看SQL怎么写. 存储过程只是将多个SQL操作集成而已, 而我个人更喜欢存储过程. 而且对Web的程序, 存储过程相对安全. 不会出现一些如注入式攻击.
  回复  引用  查看    
#27楼  2007-10-30 18:49 Alpha(奥法)      
感觉看业务而言
以数据为主的用存储过程好些
以业务为主的嵌入式好些
  回复  引用  查看    
如果你将SQL放到程序字符串,维护也是一个问题,你不能每修改一小处,比如数据库结构变了,你就要修改二处,然后再将程序编译一次吧.不过你可以将SQL放到资源文件里,呵呵,其实对于程序员来说,适合自己的,就是最好的.
  回复  引用  查看    
#29楼  2007-10-30 20:41 基点项目师      
很显然,一般的操作往往会有多个操作组合,如果按楼主的意思,在程序中实现所有逻辑,那么,多次的应用程序服务器和数据库服务器之间的网络开销就足以证明是存储过程好还是SQL好(可以想象一个大型的WEB站点,将会有多少次这样的网络传输)。

在程序中用SQL,相比存储过程,在维护上将带来巨大的反差,在多参数情况下,你会发现,修改是多么的恐怖(在一个操作序列上,参数有几十个是很正常的事情)。

当然,简单的操作,还是可以放在程序部分,不过建议集中管理,不要在程序中分布开来。


  回复  引用  查看    
#30楼  2007-10-30 20:41 kevinlzf [未注册用户]
用与不用,弄清楚自己所开的项目的数据有多大,正如前面有的朋友所说,如果是个小系统,写存储过程与用sql语句性能是一样的,这样的话,就没必要用存储过程了,谨个人观点.
  回复  引用    
#31楼  2007-10-30 20:43 kevinlzf [未注册用户]
还有,就是问下,当分页时用存储过程好呢,还是sql语句好呢?
  回复  引用    
分页当然是 sql语句 了,尤其是要加查询条件的时候。
  回复  引用  查看    
#33楼  2007-10-30 21:59 laohan [未注册用户]
存储过程在安全上,可扩展、升级上,架构分层上都要比sql好的多。
  回复  引用    
#34楼  2007-10-30 23:44 cw [未注册用户]
你同事是一个追求完美、勤奋的人, 而你不是, 有些.....
  回复  引用    
#35楼  2007-10-31 00:12 Zhuang miao      
具体情况具体分析,不要轻易否定
  回复  引用  查看    
#36楼  2007-10-31 01:15 asdfreq [未注册用户]
If you job is just one-time developping, sql statement is easy and quick. If you job includes maintenance, and further design and developping, use SP.
  回复  引用    
#37楼  2007-10-31 01:29 koenemy      
sql语句也得重用。
他认为程序中几乎不应该出现sql 语句
你在告诉你同事,,不是几乎,应该是根本,访问数据库的方式要一致。

  回复  引用  查看    
#38楼  2007-10-31 08:11 Gray.dai [未注册用户]
微软在MSDN就提倡使用存储过程。尤其是在多层结构上。
  回复  引用    
#39楼  2007-10-31 08:15 代码乱了      
存在即有理
  回复  引用  查看    
#40楼  2007-10-31 08:48 铱星      
用嵌入SQL还是用存储过程,应该基于以下考虑
1.性能
如果通过嵌入SQL要多次与数据库进行交互之类,就应该考虑存储过程,这个具体可用相关工具来测试,而不是象楼主讲的“觉得”,比如oracle中的trace命令,可以通过具体的数据来判断
2.业务逻辑
大部分情况下,涉及到业务逻辑方面的东西,尽量不要在存储过程中来实现,虽然有时候看来似乎更直接。从代码的维护和可重用性来看,用高级语言来实现更加合理

用哪种方式都不应该极端化,而是考虑最合理的方式。
  回复  引用  查看    
#41楼  2007-10-31 08:49 eidolon [未注册用户]
存储过程除了预编译,还有减少了网络传输字节,通常web服务器和数据库服务器是不同的机器,如果是内网还好一点,如果是分布式多次调用仅仅是一点点区别?另外SQL SERVER本身也可以对存储过程做更细粒度的安全控制。考虑分层结构,未来的可扩展性,比如扩展成分布式应用程序,存储过程都是一个更好的选择。MS自身所有的框架,例程如果需要用到数据库的几乎SP会成为第一选择,比如Asp.net 的MemberShip, WF的Persistence等等. 另外对于DBA来说,所有的数据访问都是通常存储过程,DBA也可以更好的维护,调优,你总不能让他跟着你看你自己拼接的字符串或者每次都用SQL Profiler去跟踪吧. 如果你的项目连DBA都没有或者DBA根本不管你的SQL语句效率如何那还有什么好说的。
  回复  引用    
#42楼  2007-10-31 08:59 徐少侠      
都是程序员

所以都不懂存储过程

所以,看到别人乱来,就以为自己这么做也是对的

中国程序员的悲哀
  回复  引用  查看    
#43楼  2007-10-31 09:22 s33 [未注册用户]
不爽,有这时间不如研究下存储过程,SQL放代码很爽?不支持
  回复  引用    
#44楼  2007-10-31 09:26 jhtchina      
尽量多的使用存储过程

  回复  引用  查看    
#45楼  2007-10-31 09:36 Kingthy      
看实际业务需求吧,如果你的一个操作要频及到多个表.那么存储过程就是首选.
比如有A,B,C三个表.当在A表中增加了一条记录时要判断是否在B,C表有相关联的记录有则添加无则返回.添加成功后再返回A表中增加记录的相关标识字段值.
如果你是在SQL语句在代码里实现的话就要提交大约3-4次左右的SQL语句.而用存储过程则可以直接封装到一个存储过程里.所以你说哪个好一点呢??而假如以后业务再发生关系,不仅判断B,C表,还要在D表里添加相对应的记录时又怎样呢?

当然,那些就是只有一个直接SELECT的语句(不管里面是否有多表关联).我则是优先考虑直接在代码里执行SQL语句..
  回复  引用  查看    
#46楼  2007-10-31 09:42 随风飘散      
我觉得楼主的讨论的问题有点词不达意了,
首先,你讨论的是,存储过程与直接写SQL语句的区别,而不是,所有的业务逻辑写成存储过程,而你的SQL 语句则是简单的CRUD .我想既然你的SQL 语句可以写成简单的CRUD ,为什么不可把存储过程也写成CRUD . 我认为没有维护的困难。
  回复  引用  查看    
#47楼  2007-10-31 09:49 Sleet [未注册用户]
我不想说什么好与坏,只是想说几个场景

一个业务要几百句的SQL来实现,难道你用高级语言来实现,一句一句的执行,也许事务能在里面控制,但在升级的时候呢,你再打开工程,再次修改程序,再次编译?还是你们公司找工程人员或实施人员会SQL和高级语言,而且用得很熟,并保证他们都能看得懂?(我们公司的工程人员,如果他能对SQL SERVER或ORACLE比较熟悉的话,我们已经可以烧高香了,有问题也不会查,厉害点的确实可以自己搞定数据库,他们不用去改什么程序)

假设在对数据进行筛选的时候,要用到临时表,你也写在高级语言中?在一个日增量为G级的数据库,你的程序能顶得住?我就真不信邪了(我们公司的系统是JAVA+ORACLE做的,数据日增长量可能为G级)
  回复  引用    
#48楼 [楼主] 2007-10-31 10:05 木刀      
@Kingthy
同意.

@Sleet
我不在软件公司工作, 我公司的ERP 就是我们自己编写, 自己维护的, 所以升级的时候无需找别人, 既然升级程序, 打开工程->修改->编译, 这是当然的了, 怎么可能指望不用重新编译项目而使其升级? 很小的细节升级是不应该的, 这说明当初的需求分析做得太不到位了, 一旦升级系统, 基本上改动都不可能是几句代码那么少.

我们公司的数据日增量也可能达到G 级, 不过我没看明白你 的意思, 为什么我的程序会顶不住? 在大数据量的系统环境下, 谁是瓶颈? 这也是我的主要指导思想之一, 就是我在文中所说的, 数据库服务器是压力最大的服务器, 由长长的sql 段构成的存储过程会给数据库服务器带来很大的负担, 所以我想尽量去减轻它的负担, 能由web 服务器处理的, 就由web 服务器处理. 临时表用得不多, 而且, 临时表也不能是主要原因吧?
  回复  引用  查看    
#49楼  2007-10-31 10:09 Sleet [未注册用户]
看来博主对数据库并没有进行大的检索,一个日增G级的系统,我就不信,你的程序在检索的时候顶得住,我有试过,如果没用存储过程,JBOSS有可能会当掉
  回复  引用    
#50楼 [楼主] 2007-10-31 10:11 木刀      
@Sleet
...... 还是没弄明白你为什么会这么说, 你的意思是: 使用了存储过程就可以顶得住, 而不用存储过程, 就会顶不住, 是这个意思吗?
  回复  引用  查看    
#51楼  2007-10-31 10:11 Sleet [未注册用户]
仔细看了一下,原来你们是自己用的,我们公司是做产品的,所以维护上肯定有很大的不同,你试一下,几百家的客户,每个都有个性化,每个月都有BUG,你试试,天天去改程序,再编译,你会不会累死
  回复  引用    
#52楼  2007-10-31 10:12 Sleet [未注册用户]
因为我们的存储过程,并不是简单的几句SQL语句就可以搞定的

还有G级的系统,应该规划用存储过程来实现(个人意见)
  回复  引用    
#53楼  2007-10-31 10:15 kiler      
@Sleet
看清楚人家说的什么在回,人家说所有的数据操作都用存储过程,你的系统里所有的表数据都是日增G级的吗?是不是一个只有几十条或者几百条数据表的操作也要写存储过程啊。

我不反对使用存储过程,但是我反对滥用存储过程。

因为我们的存储过程,并不是简单的几句SQL语句就可以搞定的

存储过程能做的事,sql一样的可以做,存储过程和sql有什么区别啊,存储过程不就是编译好的sql。
  回复  引用  查看    
#54楼  2007-10-31 10:20 Sleet [未注册用户]
--引用--------------------------------------------------
kiler: @Sleet

看清楚人家说的什么在回,人家说所有的数据操作都用存储过程,你的系统里所有的表数据都是日增G级的吗?是不是一个只有几十条或者几百条数据表的操作也要写存储过程啊。

我不反对使用存储过程,但是我反对滥用存储过程。
--------------------------------------------------------
如果是每个表都是日增G级的话,那数据库就是日增TG级了
  回复  引用    
#55楼 [楼主] 2007-10-31 10:21 木刀      
@Sleet
"还有G级的系统,应该规划用存储过程来实现(个人意见)"
能否详细说明一下理由?

我现在主要想知道的是, 对于10句, 或者说5句以内的sql 语句, 至少是能转化成这种简单sql语句 的情况, 是否应该尽量避免使用存储过程 .

对于企业级应用来说, 大量的报表, 数据维护页面, 实际上用到的sql 语句都不会需要很多句, 真正复杂的sql 段, 多半与用户没什么关系, -----举例说明吧, 比如在系统中, 创建一个用户, 一个用户登陆的时候, 去检查他的权限, 这样的动作, 我们系统目前的做法是用存储过程 , 不用说, 在存储过程中, 包含大量的逻辑检查, 而我认为这只是徒然增加了数据库的压力, 应该改写成嵌入式sql 语句, 像类似这样的情况举不胜举 .
  回复  引用  查看    
#56楼  2007-10-31 12:55 老刘.      
有一天程序开发人员可以不熟悉sql语句,就像现在的web开发人员不一定熟httpheader一样。
至于性能,游戏开发商都希望用户升级他们的系统配置。。。
  回复  引用  查看    
#57楼  2007-10-31 12:59 A.Z* [未注册用户]
其实这是典型的两类程序员的冲突,一类是平时偏向于数据库编程,一类是写应用程序,sql是两者的交集。lz的所在项目的项目经理是写sp的...从这个角度,如果lz有时间,有精力,有上进心的话,就好好的全部改写成sp,并且加上严密的注释。
我也是写应用程序的,不过一般在项目里面我都可以支配怎么去做,我不喜欢这种分歧发生,我希望看到的是应用程序主导的程序设计。
  回复  引用    
#58楼  2007-10-31 13:05 Yoshow      
我喜欢一切都用存储过程 就像我喜欢用接口的方式开发 数据量不是很大的时候用不用过程只是一种习惯 跟着自己的感觉走是最快的 ^_^
  回复  引用  查看    
#59楼  2007-10-31 13:29 阿标      
偶做的项目可能比较简单,一般不写SQL和存储过程。
  回复  引用  查看    
#60楼  2007-10-31 13:47 A.Z* [未注册用户]
如果项目里有人专门写sp,千万别和人家抢谁写sql
sql query也是sql , sp也是 sql
代码本质没有区别,sp是编译优化的,但是有一个一个sp也是可以优化sql query的,一般sp比较复杂,其实大多时候sp的复杂是由于表复杂造成的。
别用性能为sp涂金,extsp可以得到更高的性能,有没有有人有兴趣去写?
如果用2k5的话可以用.net操作元数据来得到很多.net特有的语言特性和高速性能,不过一般也用不到...
  回复  引用    
#61楼  2007-10-31 13:57 强强哥 [未注册用户]
啥事情 不要走极端 ,要效率的肯定存储过程快点啊 ,但是有的地方只是普通的查询 就没有这个必要了。 配合的用! 根据需要自由发挥!
  回复  引用    
#62楼  2007-10-31 14:20 龙骑将 [未注册用户]
两个字:搞笑。
  回复  引用    
#63楼  2007-10-31 14:21 路过 [未注册用户]
我支持你的同事.
记得ms的人说过,能让数据库干的事,就让数据库干. ms也建议把处理逻辑尽量放在存储过程里去实现. 至于说效率. 存储过程肯定也比sql高.当然,存储过程也有问题,一是编写要复杂一些.二是数据库移植会有问题.(不过有谁的数据要移来移去? 如果那样,不如用orm )

当然了,如果就是一个简单的select , 是不是用存储过程就无所谓了.
  回复  引用    
#64楼  2007-10-31 14:34 yzl [未注册用户]
我想问一下,如果用Sp的话,怎么解决动态条件查询的问题
  回复  引用    
#65楼  2007-10-31 17:08 qiaoqiao [未注册用户]
嵌入SQL在后期维护方面肯定跟不上SP.不管是大项目还是小项目.
  回复  引用    
#66楼  2007-11-01 15:21 Leem      
存储过程还是看情况使用为好,我是以sql为主,存储过程为辅.有的人就喜欢全部用存储过程,一个很简单的操作也用存储过程.感觉有点过了,为了统一而统一,为了存储过程而存储过程.
  回复  引用  查看    
#67楼  2007-11-05 15:20 丁丁      
我对Oracle数据库较熟悉,我倾向于优先使用SQL,理由是SQL有数据库并行执行和Materialized View物化视图重写功能,分析SQL的执行计划也比较方便。
  回复  引用  查看    
#68楼  2007-11-12 13:10 cozo [未注册用户]
我遇到过一个问题,在一个相当大的表里面(数据多,字段很少)根据时间字段取count(*),我是在程序里直接传SQL的,如果把时间值直接拼入字符串,执行是没有问题的,但是如果使用SQLParamter,再把时间作为参数传递给SQLCommand,执行就会超时。
  回复  引用    
#69楼  2007-11-12 13:47 丁丁      
很可能是因为你取count(*)的时候,直接写时间,Oracle数据库(如果是Oracle的话)CBO优化器可以根据统计信息,得到你查询时间区段占总数据的比例很小,就走索引了,因此快,但是使用绑定变量后,oracle就不知道这个信息,就傻傻的走全表扫描了。
  回复  引用  查看    
#70楼  2007