【发布时间】:2011-10-09 21:53:01
【问题描述】:
我对何时使用存储过程而不是代码中的嵌入式 SQL 感到困惑
当我用谷歌搜索时,我发现了这些要点
- 它们允许模块化编程。
- 它们可以减少网络流量。
- 它们可以用作安全机制。
请问网络流量与它有什么关系??
【问题讨论】:
-
SP 的另一个主要优势:您可以更改它们(修复错误、扩展) 不更改您的应用程序代码 ....
标签: sql stored-procedures plsql
我对何时使用存储过程而不是代码中的嵌入式 SQL 感到困惑
当我用谷歌搜索时,我发现了这些要点
请问网络流量与它有什么关系??
【问题讨论】:
标签: sql stored-procedures plsql
SP 的另一个主要优势:您可以更改它们(修复错误,扩展) 无需更改您的应用程序代码......又是一层分离,这可能是有益的。
还有:安全。如果您对所有内容都使用 SProcs,那么就您的数据库权限而言,您的调用者所需的所有权限都是对这些 SProcs 的EXECUTE 权限——他们不需要对您的表进行直接读/写访问。
【讨论】:
它可以减少网络流量,因为您将单个命令发送到存储过程而不是一行一行的 SQL 语句。
另一个好处是查询本身的性能优于嵌入式 SQL,因为它是预编译的。
【讨论】:
它们可以通过仅将所需数据返回给客户端来减少网络流量。
或者扭转局面;一种可能浪费网络流量的设计/编码实践是从数据库中选择一组数据,将其返回给客户端并在那里对一些数据集进行处理。显然,如果您正在处理某些数据集,从流量的角度来看,最好不要将未处理的数据发送给客户端
【讨论】:
如果您的数据库服务器和运行嵌入式 SQL 的服务器/客户端是分开的,它将减少网络流量。
它减少了网络流量,因为存储过程是在数据库服务器上处理的;对于在单独机器上运行的嵌入式 SQL,必须通过网络处理数据库访问,从而增加流量。
如果您的嵌入式 SQL 和数据库位于同一台计算机上,则不会影响网络流量。例如,一台机器上的 LAMP 堆栈。
【讨论】:
我首先会质疑存储过程......
与实际的编程语言代码不同,它们:
如果您有一个非常特定于数据库的操作(例如,维护数据库完整性的事务中操作),或者让您的过程非常原子和简单,也许您可以考虑它们。
预先指定“高性能”时建议谨慎。它通常会以牺牲良好设计为代价导致糟糕的选择,而且它会比你想象的更快地咬你。
使用存储过程需要您自担风险(来自曾经去过那里并且再也不想回去的人)。我的建议是像避免瘟疫一样避免它们。
【讨论】:
视情况而定。
我想这不是您的情况,因为您将问题标记为“plsql”、“SQL”、“存储过程”。 Pl/Sql中嵌入SQL的概念如下:
嵌入式 SQL 语句包含 DDL、DML 和事务控制 程序语言程序中的声明者。它们与 Oracle 预编译器。嵌入式 SQL 是一种方法 过程语言应用程序中的 SQL。 另一种方法是使用过程 API,例如开放式数据库连接 (ODBC) 或 Java 数据库连接 (JDBC)。
在这种情况下,有很多重要的原因。 最重要的是:
简短的回答可能是,在 PL/SQL 存储过程中编写高效代码以访问“Oracle 数据库”中的大量数据比使用任何其他语言更容易。这是因为它严格集成在 Oracle 数据库中。
之前阅读手册:Advantages of Pl/sql stored procedures
pl/sql和Oracle数据库的具体特点,就写几个吧:
使用自治事务`
数据库内部的 DML、事务管理和异常处理程序
在 SQL 内部调用 sql 函数
打包光标
流表函数 .带有 CURSOR 表达式的表函数使您能够在单个 SQL 语句中通过多个转换流式传输数据。
确定性函数
复杂的使用 dbms_SQL API 的动态 sql 操作结合原生动态 SQL(著名的第四种方法)。
所有模块化原因(您已经提到): 1 封装计算 2 简化外部sql内部使用的子查询 3 在同一个 sql 中组合标量和聚合值 4 一次编写,多次使用。
等等……
【讨论】:
可能需要存储过程才能从应用程序代码中获得所需的性能。嵌入式 SQL 的最大问题是所有业务逻辑通常都进入应用程序代码。这可能非常低效。例如,开发人员将开始进行客户端连接:他们调用数据库以获取其他表记录的一组 ID 值,然后一次查询这些表中的每一个记录以检索他们需要的数据。使用存储过程一次往返数据库可以完成的工作现在可能需要数百或数千次往返使用嵌入式 sql 的数据库。每次往返数据库都需要大量时间,更不用说每次查询都必须编译,这会极大地增加数据库服务器的负载。
如果您的应用程序是用户较少的低容量应用程序,则可以使用此方法。拥有大量用户的大容量应用程序甚至会迅速使大型数据库服务器超载并导致严重的性能问题,甚至导致应用程序停止工作。
【讨论】: