【问题标题】:What's the point of a stored procedure?存储过程的意义何在?
【发布时间】:2010-11-19 17:25:59
【问题描述】:

它们对数据库管理员以外的任何事情有用吗?如果我理解正确的话,它只是可以直接保存到 MySQL 中的查询,因此任何 Web 开发团队都无法使用它们。

【问题讨论】:

    标签: mysql sql-server


    【解决方案1】:

    存储过程是在数据库服务器上运行的代码。

    它们有多种用途。想一想:如果我可以直接在数据库服务器上运行代码,我可以用它来做什么?

    在它们的众多用途中,存储过程可用于将部分处理负载转移到数据库服务器减少网络流量、改进安全。

    http://en.wikipedia.org/wiki/Stored_procedure

    【讨论】:

    • 更不用说它允许您使用 PL/V8 之类的东西并编写 DB 端 javascript
    • @mfrankli:当然。我的回答不建议对所有事情都使用存储过程。仅在有用且收益大于成本时才使用它们。请记住,并非数据库服务器上发生的所有事情都涉及数据检索。
    【解决方案2】:

    以下是其他答案中未涵盖的两个良好、简单的优点:

    • 安全性 - 参数化存储过程比 SQL 的连接字符串更安全(Google SQL 注入大约有一百万个文档)但是,如果您的语言支持,参数化查询也适用于此
    • 简化维护 - 更新存储过程比重新编译代码和重新部署要容易得多。在我 15 年的发展过程中,我经历了艰难的学习。如果查询可能会更改,请将其放入存储过程中。使用它比重新编译和重新部署代码要容易得多。

    已添加

    它们还减少了网络聊天。如果您有很多复杂的 wueries 需要运行,您可以将它们全部放在一个存储过程中,并且您的应用只需进行一次调用即可完成所有工作。

    此外,在大多数平台中,存储过程具有性能优势。例如,在 SQL Server 中,数据库引擎会优化并保存执行计划以加快速度。 这些链接也回答了您的问题:

    http://blog.sqlauthority.com/2007/04/13/sql-server-stored-procedures-advantages-and-best-advantage/

    http://searchsqlserver.techtarget.com/news/1052737/Why-use-stored-procedures

    而且我不能把这个答案归功于这个答案,但我认为这句话是一个很好的观点,即使我认为自己在等式的两边都很熟练 - 对于专业知识有一些话要说。

    优势四:存储过程是 通常由数据库编写 开发人员/管理员。人 担任这些角色通常更 有写作效率的经验 查询和 SQL 语句。这释放了 GUI 应用程序开发人员 在功能上利用他们的技能 和图形演示件 应用程序。如果你有你的 执行任务的人 他们最适合,那么你会 最终产生更好的整体 应用。

    【讨论】:

    • 我只在 PHP 中工作过,所以编译不是问题。我可以看到那会很痛苦......“优势 4”包含 +1,非常好。
    【解决方案3】:

    将存储过程视为库函数。您是想在每次必须计算平方根时重写 sqrt(例如)还是更愿意调用一个函数来完成它?

    这就是存储过程的好处(简而言之)。

    【讨论】:

    • 来吧,人们,当您投反对票时,请告诉我原因(尤其是事后 2 年)
    【解决方案4】:

    存储过程有很多好处。除其他外,它们有助于将应用程序代码与数据库表分离,简化数据库维护和版本控制,并有助于充分利用 DBMS 功能,例如查询参数化、优化和安全性。

    它对任何网络都是无用的 开发团队使用它们

    嗯?对于需要使用支持它们的数据库的任何开发人员来说,存储过程都非常有用。

    【讨论】:

      【解决方案5】:

      存储过程可以做的不仅仅是查询数据库。它们可以包含任何 T-SQL 语句。因此,您可以使用它们来执行业务逻辑、执行查询、进行备份等。

      许多公司都有一项政策,即所有数据库活动都必须通过存储过程完成。所以,现在我会说一个 Web 开发团队对它们没有用处。他们可能会很好地利用它们。

      另一方面,在我们公司,我们并没有在下一代制造应用中大量使用它们。我们正在使用 ORM (Linq-To-SQL) 代替,并且在这一点上很少使用存储过程。我怀疑我们仍然会在一定程度上使用它们,以避免多次往返服务器。如果您已经在服务器上工作,那么在存储过程中完成某些事情会更有效。

      【讨论】:

        【解决方案6】:

        在 90 年代,存储过程是防止任何人直接访问数据表的最安全方法。

        首先,他们更有可能应对安全问题。其次,它们旨在更容易处理数据,因为没有像今天这样的 ORM 工具。

        在过去,它们主要用于复杂的交易。当我说复杂时,我的意思是一些简单的 CRUD 操作无法解决的问题,例如 NHibernateEntity Framework 可以做到。

        所以,当存储过程只执行SELECTINSERTUPDATEDELETE 时,您可能是对的,它们现在不知何故无用,因为您可以执行这些基本的重复操作通过 ORM 工具。但是,当您必须构建一个报告时,例如,需要绝望的信息数据,并执行一些其他计算等,并且计算结果非常复杂,那么您最好让数据库引擎按原样解决这个问题旨在计算此类数据。

        【讨论】:

        • 最好从一开始就将 CRUD 的东西放入存储过程中,因为很难知道在哪里需要额外的业务规则,而存储过程为您提供了客户端程序和您的程序之间的额外层数据。
        • 也许你的数据是“绝望的”,但我的只是“不同的”=P
        • @jon_darkstar - 我看到了一些非常绝望的数据
        【解决方案7】:

        除了其他人所说的存储过程的安全性、封装性、性能等,我想补充一点,存储过程的有用性随着存储过程语言的丰富性而增加。

        我对 MySQL 没有太多经验,但据我所知,存储过程语言非常有限。

        T-SQL(在 Microsoft SQL Server 中)功能更强大,但与功能齐全的编程语言相比有几个缺点。例如,不可能在 T-SQL 中声明一个常量值,而且直到最近还没有异常处理,所以错误处理是一件很痛苦的事情。没有包的概念,因此您的所有代码都是独立的过程,除了良好的命名约定外,无法将它们组合在一起。 (虽然确实可以用 .NET 语言编写存储过程。)

        另一方面,PL/SQL(在 Oracle 中)是一种功能齐全的编程语言,具有复杂的数据类型、异常处理、用于分组过程的包(具有单独的公共和私有部分)、对象类型以及批次和许多内置包处理从文件访问到压缩和生成网页的所有内容。所有这些,加上与数据库和 SQL 语言的无缝集成。可以说,整个应用程序都可以使用 PL/SQL 构建,而无需“离开数据库”。查看http://apex.oracle.com 以获取以纯 PL/SQL 实现的大型(框架)应用程序示例。

        【讨论】:

          【解决方案8】:

          假设您在不同的表中插入两行,第二次插入需要第一行的 id。

          $sql = "INSERT INTO t1 (f1,f2...) VALUES (v1, v2...)";
          mysql_query($sql, $conn);
          $id = mysql_insert_id();
          $sql2 = "INSERT INTO t2 (f1,f2,id,f3...) VALUES (v1,v2,$id,v3....);
          mysql_query($sql2,$conn)l
          

          您两次访问数据库,两次服务器请求/响应。如果可以将INSERT、@id=insert id、INSERT all在服务器上的过程存储在my_proc中,则只需这样做一次。

          $sql = "CALL my_proc(arguments)";
          mysql_query($sql);
          

          【讨论】:

          • 如果你用另一种语言连接到 mysql,这篇文章中陈述的其他原因真的无关紧要,因为你可以用那种语言编写函数。谢谢。
          【解决方案9】:

          将它们视为任何常规程序中的过程。一种在单个调用方法下封装一大块逻辑的方法。

          如果您认为程序中的函数无用,那么本次讨论到此结束。如果您认为它们有用,那么也无处可去。没有什么会强迫您使用它们,但如果您愿意,它们是可用的。

          【讨论】:

          • 函数是我的观点,我个人宁愿有一个包含 SQL 的函数,以免混淆看到我的代码的其他人,所以他们知道一切都有一席之地......也许我只是没有达到你们的水平......
          • 嗯,一些项目将有通用查询,这些查询可以在任何地方重用。不必将相同的 sql 嵌入一百万个位置,而是嵌入一个存储过程调用。这不仅适用于 DBA...
          【解决方案10】:

          如果我理解正确的话 只是可以保存的查询 直接进入MySQL,所以它会 对任何 Web 开发团队都没用 使用它们。

          即使有这个(有限的)定义,您是在暗示 Web 开发团队永远不需要查询数据库吗?真的吗?

          一组编写良好的存储过程可以完全从您的客户端应用程序中删除查询,并将所有这些替换为对过程的调用。现在,我并不是说这是唯一的做事方式,甚至不是正确的方式。有相当多的discussion 关于这一切。但这是一种非常有效的使用方式。

          那么,对于 webdev 团队来说没用吗?

          【讨论】:

            【解决方案11】:

            除了这里给出的所有答案,我还想指出,存储过程是一种保存查询执行计划的方法。

            您可能有一组刚刚从应用程序调用的 SQL 语句,但每次执行查询时,SQL 服务器都无法知道您刚刚调用的查询与您调用的查询完全相同几分钟前(这在 Web 应用程序中会非常频繁地发生)。因此 SQL Server 必须再次重复所有处理(构建查询计划并执行它)。

            现在,如果相同的查询被封装在一个存储过程中,SQL Server 会保存该存储过程的执行计划,这样每次调用存储过程时,它就不必一直重新编译执行计划. (它甚至可以根据传递给 sproc 的参数缓存数据,但我不知道它是如何工作的)

            【讨论】:

              【解决方案12】:

              在存储过程中调优代码比大多数 ORM 创建的更容易。当有多个应用程序访问同一个数据库并且可能需要做同样的事情时,使用存储过程会更容易。当所有代码都在存储过程中时,重构数据库要容易得多,因为您可以轻松地看到需要在哪里进行更改。对于通常不与 SSIS 或报告应用程序等 ORM 挂钩的事物,使用存储过程更容易。使用存储过程,您可以限制对过程的访问,而不允许直接访问表或视图。例如,这对于执行财务数据的内部控制至关重要,并有助于防止欺诈。

              我编写了超过 1000 行的复杂过程。尝试使用 ORM 来编写这种 SQL。然后尝试获取它,使其运行而不会超时。

              【讨论】:

                猜你喜欢
                • 2011-04-15
                • 2016-04-20
                • 2018-12-07
                • 2021-07-03
                • 2014-01-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-12-29
                相关资源
                最近更新 更多