何时去存储过程而不是嵌入式SQL

时间:2011-07-21 04:03:28

标签: sql stored-procedures plsql

我很困惑,因为何时在代码中使用存储过程而不是嵌入式SQL

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

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

请告诉我网络流量与它有什么关系?

7 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

他们只需将所需数据返回给客户端即可减少网络流量。

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

答案 3 :(得分:1)

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

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

如果您的嵌入式SQL和数据库位于同一台计算机上,则它对网络流量没有影响。一个例子是一台机器上的LAMP堆栈。

答案 4 :(得分:0)

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

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

  • 不可移植(每个db都有自己的PL / SQL版本。有时同一个数据库的不同版本不兼容 - 我已经看过了)
  • 不易测试(不受行业标准单元测试框架支持)
  • 不易更新/可释放(您需要删除/创建它们 - 即修改数据库以进行更改)
  • 没有库支持(为什么在其他人拥有时编写代码)
  • 不易与其他技术整合(尝试从中调用Web服务)
  • 通常与Fortran一样原始,因此无法进行有用的编码而且不费力且费力。
  • 不提供调试/跟踪/消息记录等(有些dbs可能支持这个 - 我还没有看到它)

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

建议在预先指定“高性能”时注意。它往往导致糟糕的选择而牺牲良好的设计,它会比你想象的更快地咬你。

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

答案 5 :(得分:0)

取决于

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

我认为这不是您的情况,因为您将问题标记为“ 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数据库的具体特征,只是为了写一些:

    • 使用自主交易来独立工作单位的优势

    • db中的DML,事务管理和异常处理程序

    • 在SQL中调用sql函数**

    • 打包游标

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

    • 确定性功能

    • 使用dbms_SQL API 和本机动态SQL(着名的第四种方法)进行复杂的动态sql操作。

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

    • <强>等等...

答案 6 :(得分:0)

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

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