【问题标题】:When to go for stored procedures rather than embedded SQL何时使用存储过程而不是嵌入式 SQL
【发布时间】:2011-10-09 21:53:01
【问题描述】:

我对何时使用存储过程而不是代码中的嵌入式 SQL 感到困惑

当我用谷歌搜索时,我发现了这些要点

  • 它们允许模块化编程。
  • 它们可以减少网络流量。
  • 它们可以用作安全机制。

请问网络流量与它有什么关系??

【问题讨论】:

  • SP 的另一个主要优势:您可以更改它们(修复错误、扩展) 不更改您的应用程序代码 ....

标签: sql stored-procedures plsql


【解决方案1】:

SP 的另一个主要优势:您可以更改它们(修复错误,扩展) 无需更改您的应用程序代码......又是一层分离,这可能是有益的。

还有:安全。如果您对所有内容都使用 SProcs,那么就您的数据库权限而言,您的调用者所需的所有权限都是对这些 SProcs 的EXECUTE 权限——他们不需要对您的表进行直接读/写访问。

【讨论】:

    【解决方案2】:

    它可以减少网络流量,因为您将单个命令发送到存储过程而不是一行一行的 SQL 语句。

    另一个好处是查询本身的性能优于嵌入式 SQL,因为它是预编译的。

    【讨论】:

      【解决方案3】:

      它们可以通过仅将所需数据返回给客户端来减少网络流量。

      或者扭转局面;一种可能浪费网络流量的设计/编码实践是从数据库中选择一组数据,将其返回给客户端并在那里对一些数据集进行处理。显然,如果您正在处理某些数据集,从流量的角度来看,最好不要将未处理的数据发送给客户端

      【讨论】:

        【解决方案4】:

        如果您的数据库服务器和运行嵌入式 SQL 的服务器/客户端是分开的,它将减少网络流量。

        它减少了网络流量,因为存储过程是在数据库服务器上处理的;对于在单独机器上运行的嵌入式 SQL,必须通过网络处理数据库访问,从而增加流量。

        如果您的嵌入式 SQL 和数据库位于同一台计算机上,则不会影响网络流量。例如,一台机器上的 LAMP 堆栈。

        【讨论】:

          【解决方案5】:

          我首先会质疑存储过程......

          与实际的编程语言代码不同,它们:

          • 不可移植(每个数据库都有自己的 PL/SQL 版本。有时同一数据库的不同版本不兼容 - 我见过)
          • 不易测试(行业标准单元测试框架不支持)
          • 不容易更新/发布(您需要删除/创建它们 - 即修改数据库以进行更改)
          • 没有库支持(为什么要写代码,别人有)
          • 不易与其他技术集成(尝试从它们调用 Web 服务)
          • 通常与Fortran 一样原始,因此完成有用的编码既不优雅又费力
          • 不提供调试/跟踪/消息记录等(某些 dbs 可能支持这一点 - 不过我还没有看到)

          如果您有一个非常特定于数据库的操作(例如,维护数据库完整性的事务中操作),或者让您的过程非常原子和简单,也许您可​​以考虑它们。

          预先指定“高性能”时建议谨慎。它通常会以牺牲良好设计为代价导致糟糕的选择,而且它会比你想象的更快地咬你。

          使用存储过程需要您自担风险(来自曾经去过那里并且再也不想回去的人)。我的建议是像避免瘟疫一样避免它们。

          【讨论】:

          • 同意,我会投票,但它并没有真正回答 OP 的问题:D
          • 是的,这回答了这个问题。当您需要提到的每个点时,您不使用 SP。
          • 问题被标记为 plsql,并且标记的描述说它是 Oracle Corporation 的 SQL 过程语言扩展。在 Oracle 的上下文中,我在每一点上都不同意(除了第一个可能与此范围无关的问题)。 Oracle PL/SQL 是一流的编程语言:代码易于测试/更新/交付;具有良好的单元测试框架和库;为调试/跟踪提供良好的工具支持;可以与各种技术集成;等等。如果一个人致力于 Oracle 软件堆栈 PL/SQL 是一个有效的选择。待续...
          • ... OTOH 在考虑一般存储过程时,我同意您的回答。
          【解决方案6】:

          视情况而定

          • 您是否正在编写一个应与多个数据库一起运行的应用程序?
          • 您的应用程序需要什么样的数据操作?简单而精简的数据操作?

          我想这不是您的情况,因为您将问题标记为“plsql”、“SQL”、“存储过程”。 Pl/Sql中嵌入SQL的概念如下:

          嵌入式 SQL 语句包含 DDL、DML 和事务控制 程序语言程序中的声明者。它们与 Oracle 预编译器。嵌入式 SQL 是一种方法 过程语言应用程序中的 SQL。 另一种方法是使用过程 API,例如开放式数据库连接 (ODBC) 或 Java 数据库连接 (JDBC)。

          在这种情况下,有很多重要的原因。 最重要的是:

          1. 简短的回答可能是,在 PL/SQL 存储过程中编写高效代码以访问“Oracle 数据库”中的大量数据比使用任何其他语言更容易。这是因为它严格集成在 Oracle 数据库中。

          2. 之前阅读手册:Advantages of Pl/sql stored procedures

            • 改进的性能
              • 网络流量(通过网络发送的少量信息)。 一次调用存储过程,可以在数据库服务器上完成大量数据操作,无需来回使用单个sql语句,也无需通过网络发送数据操作本身的中间状态所需的数据。这个概念与需要密集和高效的数据操作/操作的应用程序密切相关。这不仅仅是要使用和发送到客户端的数据子集的问题,而是在中间数据处理状态以达到最终数据的质量问题!如果需要的结果涉及很多sql步骤和语句要完成,优势就很明显了。
            • 编译时不需要编译
            • 代码在 SGA 的共享池中的可能性更大。
            • 代码的内存分配
            • 定义者权限程序的安全性
            • 使用调用者权限过程继承特权和架构上下文
          3. pl/sql和Oracle数据库的具体特点,就写几个吧:

            • 使用自治事务`

            • 进行独立工作单元的优势
            • 数据库内部的 DML、事务管理和异常处理程序

            • 在 SQL 内部调用 sql 函数

            • 打包光标

            • 流表函数 .带有 CURSOR 表达式的表函数使您能够在单个 SQL 语句中通过多个转换流式传输数据。

            • 确定性函数

            • 复杂的使用 dbms_SQL API 的动态 sql 操作结合原生动态 SQL(著名的第四种方法)。

            • 所有模块化原因(您已经提到): 1 封装计算 2 简化外部​​sql内部使用的子查询 3 在同一个 sql 中组合标量和聚合值 4 一次编写,多次使用。

            • 等等……

          【讨论】:

            【解决方案7】:

            可能需要存储过程才能从应用程序代码中获得所需的性能。嵌入式 SQL 的最大问题是所有业务逻辑通常都进入应用程序代码。这可能非常低效。例如,开发人员将开始进行客户端连接:他们调用数据库以获取其他表记录的一组 ID 值,然后一次查询这些表中的每一个记录以检索他们需要的数据。使用存储过程一次往返数据库可以完成的工作现在可能需要数百或数千次往返使用嵌入式 sql 的数据库。每次往返数据库都需要大量时间,更不用说每次查询都必须编译,这会极大地增加数据库服务器的负载。

            如果您的应用程序是用户较少的低容量应用程序,则可以使用此方法。拥有大量用户的大容量应用程序甚至会迅速使大型数据库服务器超载并导致严重的性能问题,甚至导致应用程序停止工作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-04-02
              • 1970-01-01
              • 2012-07-06
              • 1970-01-01
              • 1970-01-01
              • 2021-07-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多