何时选择存储过程而不是嵌入式SQL?

5

我很困惑什么时候应该使用存储过程而不是在代码中嵌入SQL语句。

当我进行谷歌搜索时,发现以下几点:

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

请告诉我网络流量如何与其相关?


4
SP 的另一个主要优势是,你可以在不改变应用程序代码的情况下对它们进行更改(修复错误、扩展功能)。 - marc_s
7个回答

6

SP的另一个主要优势是:您可以更改它们(进行错误修复,扩展)而不需要更改应用程序代码...这是另一层分离,可能会产生好处。

还有:安全性。如果您对所有内容使用SProcs,则所有调用者在数据库方面所需的权限仅为对这些SProcs的EXECUTE权限 - 他们不需要直接读/写访问您的表格。


3

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

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


2
他们可以通过仅向客户端返回所需数据来减少网络流量。
或者说,一种可能浪费网络流量的设计/编码实践是从数据库中选择一组数据,将其返回给客户端,并在某些数据集上进行处理。显然,如果您正在处理某些数据集,从流量的角度来看,最好不要向客户端发送未被处理的数据。

1

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

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

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


0

首先,我会质疑是否需要使用存储过程...

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

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

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

在指定“高性能”时应谨慎。这往往会导致以牺牲良好设计为代价做出糟糕的选择,并且它会比你想象的更快地让你后悔。

自行决定使用存储过程要冒一定风险(来自一个曾经有过类似经历并且绝不想再回去的人)。我的建议是尽量避免使用它们。


同意,我会点赞,但这并没有真正回答楼主的问题:D - Edgar Velasquez Lim
是的,这回答了问题。当您需要使用提到的每个小点时,不要使用SP。 - Daveo
3
这个问题被标记为 PL/SQL,并且该标签的描述说它是“Oracle公司SQL过程化语言扩展”。在 Oracle 的背景下,除了第一个可能不相关的观点外,我对每个观点都持不同意见。Oracle PL/SQL 是一种一流的编程语言:代码易于测试、更新、交付;具有良好的单元测试框架和库;提供了良好的工具支持进行调试/跟踪;可以与各种技术集成等。如果一个人致力于使用 Oracle 软件栈,PL/SQL 是一个有效的选择。待续... - user272735
另一方面,就一般而言,我同意您的存储过程答案。 - user272735

0

这要看情况而定

  • 您是否正在编写应该在多个数据库上运行的应用程序?
  • 您的应用程序需要什么类型的数据操作?简单和轻量级的数据操作吗?

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

嵌入式 SQL 语句将 DDL、DML 和事务控制语句纳入到过程化语言程序中。它们与 Oracle 预编译器一起使用。嵌入式 SQL 是在过程化语言应用程序中纳入 SQL 的一种方法。另一种方法是使用过程 API,例如 Open Database Connectivity (ODBC) 或 Java Database Connectivity (JDBC)。

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

  1. 简单来说,使用PL/SQL存储过程在Oracle数据库中访问大量数据比其他语言更容易编写高效的代码。这是因为它严格集成在Oracle数据库中。

  2. 在阅读手册之前,请参考:Pl/sql存储过程的优势

    • 提高性能
      • 网络流量(通过网络发送少量信息)。通过单个调用存储过程,在db服务器上可以完成大量数据操作和处理,而不需要反复使用单个SQL语句并发送需要进行中间状态数据操作的数据。这个概念与需要密集和高效的数据操作/处理的应用程序密切相关。这不仅涉及要使用和发送到客户端的数据子集,还涉及中间数据处理状态中数据质量的问题,以实现最终数据!如果所需结果涉及许多SQL步骤和语句,则优势显而易见。
    • 编译时不需要编译
    • 代码更有可能在SGA的共享池中
    • 代码的内存分配
    • 具有定义者权限过程的安全性
    • 具有调用者权限过程的继承权限和模式上下文
  3. PL/SQL和Oracle数据库的特定特征,以下是其中的一些:

    • 使用自主事务进行独立工作单元的优点

    • 在db内部进行DML、事务管理和异常处理

    • 在SQL中调用SQL函数

    • 打包游标

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

    • 确定性函数

    • 使用dbms_SQL API进行复杂的动态SQL操作与本地动态SQL结合使用(著名的第四种方法)。

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

    • 等等...


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接