我想编写一个简单的单行查询来从数据库中只选择一个值。
因此,如果我为这个查询编写存储过程而不是在 c# 代码中编写简单的选择查询,那么我确信这个简单选择查询的存储过程会更快,但为什么呢?
我对存储过程与在我的代码中编写简单查询感到困惑?我很困惑,为什么存储过程比直接用代码编写的简单查询要快?
我想编写一个简单的单行查询来从数据库中只选择一个值。
因此,如果我为这个查询编写存储过程而不是在 c# 代码中编写简单的选择查询,那么我确信这个简单选择查询的存储过程会更快,但为什么呢?
我对存储过程与在我的代码中编写简单查询感到困惑?我很困惑,为什么存储过程比直接用代码编写的简单查询要快?
存储过程比 SQL 代码快
这是一个神话,性能总是相同的,来自书中: 为企业构建 Microsoft® .NET 解决方案:
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 代码都以相同的方式处理。编译后性能相当。时期。
"Stored procedures are precompiled and cached so the performance is much better."
这让 我心碎
来自Microsoft Corp.的Christa Carpentiere为 .NET 开发人员撰写了An Evaluation of Stored Procedures
这取决于查询,对于简单查询,最好将其作为查询本身编写和执行。但是,当您在数据库端有更多的处理工作(您想在游标中处理数据等)时,存储过程会更好,因为它们在数据库服务器上执行并避免不必要的开销,例如解析和额外的通信.
存储过程是存储在数据库中的查询。它们是预编译的。当您请求数据库执行存储过程(SQL Server)时,SQL Server 已经有了该存储过程的执行计划。而简单的查询需要在运行时创建它们的执行计划。你需要在这里学习更多
存储过程经过预编译和优化,这意味着查询引擎可以更快地执行它们。相比之下,代码中的查询必须在运行时进行解析、编译和优化。这一切都需要时间。