为什么存储过程比Query快

时间:2012-10-18 06:21:58

标签: c# sql sql-server stored-procedures

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

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

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

5 个答案:

答案 0 :(得分:77)

  

存储过程比SQL代码更快

这是一个神话,表现总是相同的,来自书:Architecting Microsoft® .NET Solutions for the Enterprise:

  

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代码都以相同的方式处理。编译后,性能相当。周期。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

"Stored procedures are precompiled and cached so the performance is much better."

这让我心碎,就像您知道SQL Server 2005之前的情况一样。这篇文章打破了神话Stored Procedures DO NOT increase performance

Microsoft Corp。的Christa Carpentiere写道An Evaluation of Stored Procedures for the .NET Developer

答案 3 :(得分:-2)

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

答案 4 :(得分:-2)

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