【问题标题】:Why Stored Procedure is faster than Query为什么存储过程比查询快
【发布时间】:2012-10-08 12:53:19
【问题描述】:

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

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

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

【问题讨论】:

  • @Cuong Le 我从谷歌上搜索,发现存储过程甚至比简单的查询都快,但不清楚为什么??
  • @Coung Le 所以如果两者的性能相同,那么很明显我们只是出于安全原因使用存储过程????
  • 对于 SQL 注入,“安全原因”是什么意思?
  • @CuongLe 的意思是要求我们使用存储过程来保护我们的应用程序免受黑客攻击???
  • 这是第二个迷思,安全是横切关注点,应该是从表现层到其他层。不代表,使用 SQL 很容易破解

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


【解决方案1】:

存储过程比 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 代码都以相同的方式处理。编译后性能相当。期间。

【讨论】:

  • 你打我的主意。也需要从您的角度再次研究它。感谢您的不同观点。
  • 存储过程非常适合加速某些数据库操作...但是,在“创建”存储过程时,设置 NOEXEC ON 将有助于预编译 SP(SQL 语句)。 :)
  • @muhammadkashif:这已经过时了,SP 是从 10 年前开始的,趋势是使用 ORM 在代码中动态生成 SQL。 SP难维护,想想怎么在SQL代码里调试,真的很痛苦
  • 补充一点 - 至少 according to these docs,“将新 SQL 语句与缓存中现有的、未使用的执行计划相匹配的算法要求所有对象引用都是完全限定的"
【解决方案2】:
"Stored procedures are precompiled and cached so the performance is much better."

这让我心碎

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 意思是说存储过程不适合简单的单一查询??我应该写一个简单的查询而不把它写在存储过程中???
    • 存储过程非常适合加速某些数据库操作
    • 我的意思是在某些情况下静态查询比使用存储过程更好。特别是如果它是一个简单的查询。干杯!
    【解决方案4】:

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

    【讨论】:

    • 这就是为什么存储过程比即席查询快
    • @muhammad kashif 谢谢 :) 我读了你的链接,让我的思路清晰。
    • 这只是简单的不是真的 - 查看接受的答案
    【解决方案5】:

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

    【讨论】:

    • 这只是简单的不是真的 - 查看接受的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2018-08-19
    • 2018-01-02
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多