SQL服务器的性能:什么样的速度更快,存储的过程或看法?
-
05-07-2019 - |
题
什么是快在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
的表,其中包含这两列(以及其他列):DateOfBirth
和MaleFemale
。
一个名为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,它需要相同的时间。
有人想过吗?