我很困惑什么时候应该使用存储过程而不是在代码中嵌入SQL语句。
当我进行谷歌搜索时,发现以下几点:
- 它们允许模块化编程。
- 它们可以减少网络流量。
- 它们可以用作安全机制。
请告诉我网络流量如何与其相关?
我很困惑什么时候应该使用存储过程而不是在代码中嵌入SQL语句。
当我进行谷歌搜索时,发现以下几点:
请告诉我网络流量如何与其相关?
SP的另一个主要优势是:您可以更改它们(进行错误修复,扩展)而不需要更改应用程序代码...这是另一层分离,可能会产生好处。
还有:安全性。如果您对所有内容使用SProcs,则所有调用者在数据库方面所需的权限仅为对这些SProcs的EXECUTE
权限 - 他们不需要直接读/写访问您的表格。
存储过程可以减少网络流量,因为您只需要发送一个命令到存储过程,而不是一行行的SQL语句。
另一个好处是查询本身的性能比嵌入式SQL更好,因为它们是预编译的。
如果您的数据库服务器和嵌入式SQL运行的服务器/客户端是分开的,它将减少网络流量。
它减少了网络流量,因为存储过程在数据库服务器上处理;对于在单独的机器上运行的嵌入式SQL,必须通过网络处理数据库访问,从而增加了流量。
如果您的嵌入式SQL和数据库在同一台机器上,则不会影响网络流量。一个例子是在一台机器上的LAMP堆栈。
首先,我会质疑是否需要使用存储过程...
与实际编程语言代码不同,它们:
如果您有一个非常特定于数据库的操作(例如,在事务中维护数据库完整性),或者保持您的过程非常原子和简单,也许您可以考虑使用它们。
在指定“高性能”时应谨慎。这往往会导致以牺牲良好设计为代价做出糟糕的选择,并且它会比你想象的更快地让你后悔。
自行决定使用存储过程要冒一定风险(来自一个曾经有过类似经历并且绝不想再回去的人)。我的建议是尽量避免使用它们。
这要看情况而定。
我猜这不是您的情况,因为您将问题标记为'plsql'、'SQL'、'存储过程'。 在 Pl/Sql 中嵌入 SQL 的概念如下:
嵌入式 SQL 语句将 DDL、DML 和事务控制语句纳入到过程化语言程序中。它们与 Oracle 预编译器一起使用。嵌入式 SQL 是在过程化语言应用程序中纳入 SQL 的一种方法。另一种方法是使用过程 API,例如 Open Database Connectivity (ODBC) 或 Java Database Connectivity (JDBC)。
在那种情况下,有许多重要的原因。 最重要的原因是:
简单来说,使用PL/SQL存储过程在Oracle数据库中访问大量数据比其他语言更容易编写高效的代码。这是因为它严格集成在Oracle数据库中。
在阅读手册之前,请参考:Pl/sql存储过程的优势
PL/SQL和Oracle数据库的特定特征,以下是其中的一些:
使用自主事务进行独立工作单元的优点
在db内部进行DML、事务管理和异常处理
在SQL中调用SQL函数
打包游标
流式表函数。带有CURSOR表达式的表函数使您能够通过单个SQL语句流式传输数据进行多次转换。
确定性函数
使用dbms_SQL API进行复杂的动态SQL操作与本地动态SQL结合使用(著名的第四种方法)。
所有模块化原因(您已经提到): 1.封装计算 2.简化外部SQL中使用的子查询 3.在同一SQL中组合标量和聚合值 4.只需编写一次,使用多次。
等等...
为了从应用程序代码中获得所需的性能,可能需要使用存储过程。嵌入式SQL的最大问题是所有业务逻辑通常都放在应用程序代码中,这可能非常低效。例如,开发人员将开始执行客户端连接:他们调用数据库以获取其他表记录的一组ID值,然后查询每个表以检索所需的数据。使用存储过程可以通过一次往返到数据库来完成的操作,现在可能需要进行数百或数千次往返到数据库的嵌入式SQL。每次与数据库的往返都需要很长时间,更不用说每个查询都必须被编译,从而极大地增加了数据库服务器的负载。
如果您的应用程序是低容量应用程序且用户较少,则可以使用此方法。高容量应用程序具有大量用户,即使是大型数据库服务器也可能会快速超载,并导致严重的性能问题,甚至导致应用程序停止工作。