SQL Server性能:什么更快,存储过程还是视图?

SQL Server性能:什么更快,存储过程还是视图?,sql,sql-server,stored-procedures,views,Sql,Sql Server,Stored Procedures,Views,在SQLServer2005/2008中,存储过程或视图中什么更快 编辑: 正如你们许多人指出的,我太含糊了。让我试着更具体一点。 我想知道视图中特定查询与存储过程中完全相同的查询的性能差异。 (我仍然感谢所有指出它们不同能力的答案)不幸的是,它们不是同一类型的野兽 存储过程是一组T-SQL语句,可以返回数据。它可以执行各种逻辑,并且不一定在结果集中返回数据 视图是数据的表示形式。它主要用作一个或多个具有底层连接的表的抽象。它总是由零行、一行或多行组成的结果集 我想你的问题更像是: 哪个更快:S

在SQLServer2005/2008中,存储过程或视图中什么更快

编辑: 正如你们许多人指出的,我太含糊了。让我试着更具体一点。
我想知道视图中特定查询与存储过程中完全相同的查询的性能差异。
(我仍然感谢所有指出它们不同能力的答案)

不幸的是,它们不是同一类型的野兽

存储过程是一组T-SQL语句,可以返回数据。它可以执行各种逻辑,并且不一定在结果集中返回数据

视图是数据的表示形式。它主要用作一个或多个具有底层连接的表的抽象。它总是由零行、一行或多行组成的结果集

我想你的问题更像是:

哪个更快:
SELECT
ing从一个视图,或者存储过程中等效的
SELECT
语句,给定相同的基表使用相同的where子句执行连接


这不是一个真正可以回答的问题,因为答案在所有情况下都是正确的。但是,作为特定于SQL Server的实现的一般答案

一般来说,存储过程很有可能比直接SQL语句更快,因为当存储过程第一次保存并执行时,服务器会执行各种优化

视图本质上是一个保存的SQL语句

因此,我想说,一般来说,如果每个存储过程的SQL语句都相同,并且SQL语句可以从优化中受益,则存储过程可能比视图更快。否则,一般来说,它们的性能将相似

请参考这些支持我的答案的链接文档


另外,如果您正在寻找优化SQL Server性能的所有方法,那么上面的第二个链接是一个很好的起点。

我更喜欢存储过程,因为它可以更好地控制数据,如果您想构建一个好的、安全的模块化系统,然后使用存储过程,它可以运行多个SQL命令,控制流语句并接受参数。在视图中可以执行的所有操作都可以在存储过程中执行。但是在存储过程中,您可以更灵活地执行操作。

存储过程(SP)和SQL视图是不同的“野兽”,正如本文多次提到的那样

如果我们排除了与查询计划缓存相关的一些[通常是次要的,除了边缘情况外]性能考虑因素,与绑定到存储过程相关的时间等等,这两种方法在性能方面大体相当。但是

视图仅限于可以在单个SELECT语句中表达的任何内容(可能使用CTE和其他一些技巧),但一般来说,视图与查询的声明形式相关联。另一方面,存储过程可以使用各种过程类型构造(以及声明性构造),因此,使用SPs,可以手工设计一种解决给定查询的方法,该方法可能比SQL Server的查询优化器(基于单个声明性查询)更高效。在这些情况下,SPs可能会快得多(但请注意……优化器非常智能,不需要花太多时间就能使SP比等效视图慢得多。)


除了这些性能方面的考虑之外,SPs的功能更加广泛,允许比视图更广泛的查询和操作。

我认为另一种思考方式是使用存储过程来选择视图。这将使您的体系结构成为松散耦合的系统。如果您决定在将来更改模式,您就不必太担心它会破坏前端


我想我要说的不是sp和视图,而是sp和视图:)

存储过程和视图是不同的,有不同的用途。我将视图视为固定查询。我将存储过程视为代码模块

例如,假设您有一个名为
tblEmployees
的表,其中包含以下两列:
DateOfBirth
malefeem

一个名为
viewEmployeesMail
的视图非常有用,它只过滤掉男性员工。名为
viewEmployeesFemale
的视图也非常有用。这两种观点都是自我描述的,非常直观


现在,假设你需要列出25到30岁的所有男性员工。我倾向于创建一个存储过程来产生这个结果。虽然它肯定可以构建为一个视图,但在我看来,存储过程更适合处理这个问题。日期操作,特别是在空值是一个因素的情况下,可能会变得非常棘手。

简而言之,根据我在一些复杂查询中的经验,存储过程比函数提供更好的性能

但不能在选择或联接查询中使用存储过程的结果

如果不想在其他查询中使用结果集,最好使用SP


本论坛和其他地方的人都提到了其余的细节和差异。

还有一些其他注意事项:虽然SP和视图之间的性能基本相同(考虑到它们执行的是完全相同的选择),但SP为相同的查询提供了更大的灵活性

  • SP将支持对结果集进行排序;i、 e.,包括ORDER BY语句。您不能在视图中执行此操作
  • SP已完全编译,只需一个exec即可调用它。视图仍然需要一个
    SELECT*FROM view
    来调用它;i、 例如,在视图中编译的select上的select

    • 我知道我不应该把这个交上来