什么是快在SQL服务器2005/2008、存储程序或看法?

编辑: 正如你们许多人所指出的,我正在太模糊。让我尝试一点更为具体。
我想知道性能差异用于特定的查询来看,与完全相同的查询内存储的过程。(我仍然感谢所有的答案,指出他们不同的能力)

有帮助吗?

解决方案

存储过程(SP)和SQL视图不同<!>“beasts <!>”;正如本文所述,已多次说过。

如果我们排除与查询计划缓存相关的一些[通常是次要的,除了边缘情况]性能考虑因素,与绑定到存储过程相关的时间等,这两种方法完全等效表现明智。然而......

视图仅限于可以在单个SELECT语句中表达的任何内容(好吧,可能还有CTE和其他一些技巧),但总的来说,视图与声明形式的查询相关联 。另一个存储过程可以使用各种过程类型构造(以及声明式构造),因此,使用SP,可以手工制作解决给定查询的方法这可能比SQL-Server的查询优化器可能做得更高效(基于单个声明性查询)。在这些情况下,SP可能会快得多(但要注意......优化器非常智能,并且使SP比同等视图慢得多)。

除了这些性能考虑外,SP还具有更多功能,允许比视图更广泛的查询和操作。

其他提示

不幸的是,他们不是同一种野兽。

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

视图是数据的表示。它主要用作具有底层连接的一个或多个表的抽象。它始终是零行,一行或多行的结果集。

我怀疑你的问题更像是:

  

哪个更快:SELECT从视图或存储过程中的等效<=>语句,给定相同的基表执行具有相同where子句的连接?

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

通常,存储过程很可能比直接SQL语句更快,因为服务器在第一次保存和执行存储过程时会执行各种优化。

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

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

参考这些链接文档,支持我的回答。

http://www.sql-server-performance.com/tips/ stored_procedures_p1.aspx

http://msdn.microsoft.com/en-us/library/ ms998577.aspx

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

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

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

但是你不能在select或join查询中使用存储过程的结果。

如果您不想在另一个查询中使用结果集,最好使用SP。

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

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

例如,假设您有一个名为tblEmployees的表,其中包含这两列(以及其他列):DateOfBirthMaleFemale

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

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

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

我想我所说的不是sp vs views,而是思考sp和观点:)

一些其他考虑因素:虽然业绩之间的一个SP和图本质上是相同的(鉴于它们执行完全相同的选择),SP给你更多的灵活性,同样的查询。

  • SP会支持订购的结果设定;即包括了通过的声明。你不能这样做。
  • SP是全面汇编和仅需要执行援引。认仍然需要一个 SELECT * FROM view 援引;即一个选择在编制选择。

我知道我不应该把它变成<!>“讨论<!>”,但我对此非常感兴趣,只是想我会分享我对特定情况的经验观察,特别参考上面的所有注释,其中声明从存储过程和视图中执行的等效SELECT语句应该具有大致相同的性能。

我在数据库中有一个视图<!>“A <!>”;它在一个单独的数据库中连接5个表(db <!>“; B <!>”;)。如果我附加到db <!>“A <!>”;在视图中的SSMS和SELECT *中,需要<!> gt; 3分钟才能返回250000行。如果我从视图的设计页面中获取select语句并直接在SSMS中执行它,则需要<!> lt; 25秒在执行该过程时,将相同的select语句放入存储过程会产生相同的性能。

没有对绝对性能做任何观察(db <!>“B <!>”是一个我们不允许触摸的AX数据库!),我仍然绝对相信在这种情况下使用SP比使用View检索相同数据要快一个数量级,这适用于此特定情况下的许多其他类似视图。

我不认为它与创建与其他数据库的连接有什么关系,除非通过使用视图它以某种方式永远不能缓存连接而选择确实如此,因为我可以在2重复选择同一SSMS窗口,每个查询的性能保持一致。另外,如果我直接连接到db <!>“B <!>”;并运行select而不使用dbname.dbo .... refs,它需要相同的时间。

有人想过吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top