我不是一个 DBA 。我是做程序开发的。当然也是初出茅庐。呵呵。
之前查了下存储过程,大多都是对其的赞美但有一问题:
在应用程序中访问数据库的时候,是否应该优先考虑使用存储过程呢?
  如果可以的话,应用中几乎所有的 SQL 都可以用“存储过程”来代替。
看了对存储过程的介绍后,我甚至有将简单的 “单表SELECT” 和 INSERT 语句,等等这些简单的 SQL 都改用存储过程的冲动。
像这样“疯狂”的使用存储过程就没有一些弊端吗?

解决方案 »

  1.   

    SQL 是用来查询的,是面向集合的, PL/SQL 是的sql可以面向过程, PL/SQL的基本单位是块, 存储过程是一种命名的块
    大量使用存储过程 1移植烦,2更新难,3编写要严谨
      

  2.   

    你说的 移植难 是指在不同的数据库之间移植吧?我觉得这个无论是否使用了存储过程都是比较困难的,除非是在应用与数据库之间使用像 Hibernate 那样的工具。如果使用了它,那么还在乎是否使用了存储过程吗?(当然我还不太清楚 Hibernate 对存储过程的支持如何。)
    “更新难”----我觉得这个很牵强,面对“更新”时, SQL 的更新也不是一件容易的事。会比存储过程强多少呢?
    “编写要严谨”......这个无论何时都是必须的。
      

  3.   

    很简单,PL-SQL的引擎和SQL引擎的机制不同,解析代价不同,数据库对SQL的优化程度大于等于对PL-SQL的优化程度你自己写个排序和order by 相比,你能比Oracle的效率高否,用 PL-SQL肯定不可能。
      

  4.   

    误会了,我不是要用 存储过程去写一个已经用 SQL 实现的功能。
    我的意思是,在应用程序需要访问数据库的时候,以前在应用中用的都是 SQL ,今天简单的认识了一下存储过程,感觉储过程不但在处理复杂的数据处理过程中存在优势,甚至对于简单的数据处理例如:
    SELECT column_a FROM table_a WHERE id = 1; 这个简单查询都很有优势,因为对于 SQL 而言需要每次都编译这个语句,但如果把这个语句用存储过程来取代,因为存储过程只需编译一次,所以在运行效率上这简单的查询的效率都会高于 SQL 。
    但是不是说存储过程可以滥用呢?即能否,或者说有没有必要将一个简单的查询都写成存储过程呢?
      

  5.   


    任何数据库都不会每次去“编译”这个语句   sql本身和它的执行计划都在数据库中有缓存 起码能够有PL-SQL语言的数据库都能做到这点相对查询的成本,编译的开销可以忽略,除非是上亿条结构完全一致,数值不一致的语句,但是前面说了,这种语句,只会在第一次执行的时候编译。
      

  6.   

    存储过程的好处 是把数据库业务逻辑固化在数据库中  程序开发人员只需要理解到接口的程度(也就是进什么数出什么数)坏处就是开发存储过程的人,一般以上都是对业务逻辑没有理解透彻,对事务管理没有足够认识,对并发/性能一知半解的人。所以会经常发现,能够一条sql搞定的数据库操作,被人写成了一百多行的存储过程,其人还觉得自己很牛;
    一个频繁数据操作的表,经常因为DDL操作被锁定
    一个操作是违反事务逻辑的,用自治事务硬塞进去了,造成了数据逻辑错误。
      

  7.   


    感谢朋友的指点。不过我想说的是,如果我现在要进行数据库访问,可能一些复杂的查询我需要使用存储过程,这种情况没有任何争议。但如果是一个简单的查询为什么通常都会选择 SQL 而不是存储过程。
      

  8.   

    大哥,难道你不觉得sql比存储过程用起来要容易的多吗?
    一个简单的sql,有必要写存储过程吗?存储过程本来就不是为了处理简单的sql而创造出来的,你干嘛背道而驰!
    还有你了解存储过程的执行计划吗?谁告诉你存储过程处理sql非常有优势了,
    你处理下动态sql试试,用存储过程处理的比拼接好后用sql执行要慢多了!
    仁者见仁,智者见智!
    而且存储过程都要放到哪?
    sql呢?需要放吗?
    原因很多,自己觉得必要的原因就有这些了!
      

  9.   


    感谢你的指点。我不是很熟悉存储过程,但是之前曾看到过“存储过程的运行效率要比 SQL 高”的说法,所以有此一问。在此你提到“还有你了解存储过程的执行计划吗?谁告诉你存储过程处理sql非常有优势了,
    你处理下动态sql试试,用存储过程处理的比拼接好后用sql执行要慢多了!”看来我要好好的学习一下存储过程了。
      

  10.   

    ORACLE 能够用SQL解决的问题尽量使用SQL,ORACLE 对SQL语句的优化是可控的,并且ORACLE 推出许多优化SQL的方法,并对SQL做了很多的扩展。例如,层次查询,分析函数等等。
    相对存储过程主要是面向执行过程,有利于对程序的封装,就像JAVA的接口。
      

  11.   

    我觉得存储过程最大的优势,应该在于它可以将很多复杂的处理放到服务器端来处理,
    比如,你要进行很复杂的业务处理,写一条单纯的sql文不行,这个时候,如果你通过java或其他程序来处理的话,可能要访问很多次数据库,然后进行数据整合啊,业务判断啊,等等一系列处理,那么这样的处理过程肯定是很花时间的,这个时候如果利用存储过程,比如把这些数据性的业务处理全部放到存储过程中来做,那么交由服务器来处理,肯定要比程序快的多,而且以后维护这部分东西,也只需要修改这个存储过程就可以,而不需要去修改程序,这样也变的容易维护!
    但是如果是很简单的东西,那么把所有的sql都不要了,都放到服务器的存储过程中,也许某天,你的服务器就挂掉了!
    所以必须从多方面来考虑,到底应该有那种方式来处理,不能单纯的只考虑能不能实现这一点,这样sql确实没必要了,但是这也是不现实的!
      

  12.   

    居然还有这种问题。我无言了。既然这样,我要问你:既然有面向对象语言C++了,为啥还要有C语言?为啥还有汇编语言?现在还有个数据库系统叫NoSQL,你的梦想可以在它里面找到了。
      

  13.   

    呵呵,见笑了。我对 C ,C++  或汇编的存在价值有一点点了解。所以我知道即便有了 C++ ,在某些时候还是要 C 的。但在 SQL 与存储过程之间的关系上的领悟却不是很清晰,所以有此一问。
      

  14.   

    谢谢,结合楼上朋友们的回复,现在似乎有一些明白了。能具有说服力的理解就是:存储过程是要由数据库管理的,它要占用数据的资源。但这个结论我觉得说服力也不是很强。因为在“某个程序中对数据库的访问”毕竟是有限的,即便该应用使用的存储过程在多,我猜测数据库还是应该可以应付的吧? 当然可以理解对于 DBA 来说 SQL 是非常灵活的,因为 DBA 不能预先知道所有的数据库访问,并对这些访问创建存储过程。但对于一个应用程序来说呢?只是因为一些简单的 SQL 相对存储过程来说效率基本没有降低(之前认为是有性能差距的)。同时采用 SQL 访问数据库已经成为了程序员的一种编程惯性,或者说是 SQL 写起来比存储过程简单,所以对于应用程序对数据库的访问时,SQL 也没有“过时”?