存储过程和准备语句之间的区别?

问题描述 投票:0回答:3

存储过程和准备语句之间有什么区别...哪个更好以及为什么...!!我试图用谷歌搜索它,但没有找到更好的文章......

stored-procedures prepared-statement
3个回答
66
投票

存储过程是 PL/SQL 语言的指令序列。是由某些 DBMS 实现的编程语言,可让您存储经常应用于模型的查询序列,并与应用程序层共享处理负载。

准备好的语句是用占位符而不是实际值编写的查询。您编写查询,DBMS 仅对其进行一次编译,然后您只需传递值以放入占位符中。使用准备好的语句的优点是可以显着提高性能,并保护您的应用程序免受 SQL 注入。

区别在于您无法存储准备好的语句。每次需要执行时,您都必须“准备”它们。另一方面,存储过程可以存储并与模式关联,但您需要了解 PL/SQL 才能编写它们。

您必须检查您的 DBMS 是否支持它们。

两者都是非常有用的工具,您可能想结合使用。

希望这个简短的解释对您有用!


30
投票

其他答案已经暗示了这一点,但我想明确列出优点和缺点:

存储过程

优点:

  1. 每个查询的处理速度比直接查询更快,因为服务器对它们进行了预编译。
  2. 每个查询只需写入一次。它可以根据需要多次执行,甚至可以跨不同的会话和不同的连接。
  3. 允许查询包含单独用 SQL 不可能或难以编写的编程结构(例如循环、条件语句和错误处理)。

缺点

  1. 需要了解数据库服务器使用的任何编程语言。
  2. 有时可能需要特殊权限才能写入或调用它们。

准备好的声明

优点

  1. 与存储例程一样,速度很快,因为查询是预编译的。

缺点

  1. 每次连接或会话都需要重新编译。
  2. 为了值得开销,每个准备好的语句必须执行多次(例如在循环中)。如果查询仅执行一次,则准备准备语句的开销会比返回的开销更多,因为服务器无论如何都需要编译 SQL,而且还需要生成准备语句。

为了我的钱,我每次都会选择存储过程,因为它们只需要编写和编译一次。此后,每次调用该过程都会节省时间,无论您是否处于新连接上,也无论您是否在循环中调用该过程。唯一的缺点是需要花一些时间学习编程语言。如果我没有编写存储过程的权限,我会使用准备好的语句,但前提是我必须在同一会话中多次重复执行相同的查询。

这是我对这两种结构之间的差异进行了几个月断断续续的研究后得出的结论。如果有人能够纠正我所做的错误概括,那么任何声誉损失都是值得的。

我在上面的分析中忽略了安全问题。那是因为我不知道存储过程和准备语句之间的安全性有任何差异。 (如果有显着差异,我有兴趣学习它们。)


13
投票

存储过程存储在数据库中 - 取决于它被编译的数据库(Oracle、MS SQL Server 等),并且当您在服务器上创建它时可能会进行优化...

准备好的语句是由服务器解析的语句,并且每当您运行该语句时,服务器都会创建一个执行计划以供执行...通常当一条语句运行多次时才有意义...取决于数据库服务器(Oracle 等),甚至有时配置选项这些“准备”要么是特定于会话的,要么是“全局”...

当您比较这两者时,没有“更好”,因为它们有其特定的用例......

© www.soinside.com 2019 - 2024. All rights reserved.