47

我想编写一个简单的单行查询来从数据库中只选择一个值。

因此,如果我为这个查询编写存储过程而不是在 c# 代码中编写简单的选择查询,那么我确信这个简单选择查询的存储过程会更快,但为什么呢?

我对存储过程与在我的代码中编写简单查询感到困惑?我很困惑,为什么存储过程比直接用代码编写的简单查询要快?

4

5 回答 5

93

存储过程比 SQL 代码快

这是一个神话,性能总是相同的,来自书中: 为企业构建 Microsoft® .NE​​T 解决方案:

SQL 是一种语言,您可以通过它声明对数据库执行的操作(查询、更新或管理操作)的意图。数据库引擎得到的只是文本。与编译器处理的 C# 源文件非常相似,SQL 源代码必须以某种方式编译以生成一系列较低级别的数据库操作 - 此输出位于执行计划的名称下。从概念上讲,执行计划的生成可以看作是编译程序的数据库副本。

存储过程相对于普通 SQL 代码所保证的所谓性能增益在于执行计划的重用。换句话说,第一次执行 SP 时,DBMS 会生成执行计划,然后执行代码。下次它只会重用之前生成的计划,从而更快地执行命令。所有 SQL 命令都需要一个执行计划。

(错误的)神话是 DBMS 仅将执行计划重用于存储过程。就 SQL Server 和 Oracle DBMS 而言,重用执行计划的好处适用于任何 SQL 语句。引用 SQL Server 2005 在线文档:

在 SQL Server 2005 中执行任何 SQL 语句时,关系引擎首先查看过程缓存以验证是否存在相同 SQL 语句的现有执行计划。SQL Server 2005 重用它找到的任何现有计划,从而节省了重新编译 SQL 语句的开销。如果不存在现有的执行计划,SQL Server 2005 会为查询生成一个新的执行计划。

围绕 SP 性能优于普通 SQL 代码的争论毫无意义。在性能方面,任何命中数据库的 SQL 代码都以相同的方式处理。编译后性能相当。时期。

于 2012-10-18T06:34:40.507 回答
2
"Stored procedures are precompiled and cached so the performance is much better."

这让 我心碎

来自Microsoft Corp.的Christa Carpentiere为 .NET 开发人员撰写了An Evaluation of Stored Procedures

于 2019-05-21T11:39:43.803 回答
1

这取决于查询,对于简单查询,最好将其作为查询本身编写和执行。但是,当您在数据库端有更多的处理工作(您想在游标中处理数据等)时,存储过程会更好,因为它们在数据库服务器上执行并避免不必要的开销,例如解析和额外的通信.

于 2012-10-18T06:27:54.390 回答
-2

存储过程是存储在数据库中的查询。它们是预编译的。当您请求数据库执行存储过程(SQL Server)时,SQL Server 已经有了该存储过程的执行计划。而简单的查询需要在运行时创建它们的执行计划。你需要在这里学习更多

于 2012-10-18T06:29:40.887 回答
-3

存储过程经过预编译和优化,这意味着查询引擎可以更快地执行它们。相比之下,代码中的查询必须在运行时进行解析、编译和优化。这一切都需要时间。

于 2012-10-18T06:25:04.353 回答