【问题标题】:Stored Procedures Vs. Views存储过程与意见
【发布时间】:2011-04-15 22:55:21
【问题描述】:

我都用过,但我不清楚什么时候应该更喜欢其中一个。我的意思是我知道存储过程可以接受参数......但真的我们仍然可以使用 Views 来执行同样的事情,对吗?

那么考虑到性能和其他方面,我何时以及为什么应该更喜欢其中一个?

【问题讨论】:

标签: sql sql-server-2008 stored-procedures comparison views


【解决方案1】:

视图就像单个保存的查询语句,它不能包含复杂的逻辑或多个语句(除了使用联合等)。对于任何复杂或可通过参数自定义的内容,您会选择具有更大灵活性的存储过程。

在数据库架构中使用视图和存储过程的组合是很常见的,而且可能是出于非常不同的原因。有时是为了在重新设计架构时实现存储过程中的向后兼容性,有时是为了使数据与在表中本地存储的方式(非规范化视图)相比更易于操作。

大量使用视图会降低性能,因为 SQL Server 更难以优化这些查询。但是,可以使用索引视图,它实际上可以在以与索引表相同的方式使用连接时提高性能。在实现索引视图时对允许的语法有更严格的限制,并且根据 SQL Server 的版本实际使它们工作时有很多微妙之处。

将视图视为更像表而不是存储过程。

【讨论】:

    【解决方案2】:

    视图的优点是可以像对待表格一样对待它们。您可以使用 WHERE 从它们中获取过滤后的数据,加入它们,等等。如果它们足够简单,您甚至可以将数据插入其中。与存储过程不同,视图还允许您对其结果进行索引。

    【讨论】:

    • 看到我的答案...?心态是“我们可以拥有一个为我们做所有这些事情的视图”,然后查看联接视图联接视图 = 对基表的可怕查询。见过,之前修过几次。并回答了相关问题stackoverflow.com/search?q=user%3A27535+macro%2Bview
    • 是的,但是是封装视图还是加入视图?单独加入不是一个足够好的理由。如果您有如此简单的视图,因此 JOINing 不是问题,为什么不使用基表呢?视图经常被滥用。
    • 这些反对 VIEW 的论据似乎很弱,并且依赖于广泛的概括或糟糕的查询计划器。看看硬币的另一面,批评者认为使用存储过程代替 VIEW 是一个好主意,因为它不能在 JOIN 中使用。这似乎很疯狂。
    • @gbn:你说的问题不是视图的错,这只是人们在不了解其含义的情况下使用视图的不幸副作用。不幸的是,我看到滥用视图的次数似乎远多于正确使用它们。
    • “如果它们很简单,您甚至可以将数据插入其中”:这可能反过来为选择存储过程提供了理由:这可以防止插入尝试(插入视图可能只插入另一个表并且不在目标视图中添加任何内容,因此在视图中插入可能是人们希望禁止的)。
    【解决方案3】:

    两个基本原理。

    如果您不希望插入成为可能,请使用存储过程而不是视图。在视图中插入可能不会给出它看起来要做的事情。它将在表中插入一个可能与视图中的查询不匹配的行,该行将不会出现在视图中;插入某处,但未插入该语句的位置。

    如果您不能使用来自另一个存储过程的存储过程的结果,请使用视图(我无法让后者工作,至少在 MySQL 中是这样)。

    【讨论】:

      【解决方案4】:

      我将存储过程的使用与向数据库发送/接收事务的需求相关联。也就是说,每当我需要将数据发送到我的数据库时,我都会使用存储过程。当我想更新数据或查询数据库以获取要在我的应用程序中使用的信息时也是如此。

      当您想要提供给定表中的字段子集时,数据库视图非常适合使用,允许您的 MS Access 用户查看数据而没有修改数据的风险,并确保您的报告将生成预期的结果。

      【讨论】:

      • 首先,您不应该拥有 MS Access 用户。其次,适当的安全性和权限应防止他们修改数据。不是视图。
      【解决方案5】:

      如果存在特定的表组合或您始终想要查询的数据子集(例如,使用其权限加入的用户),则视图非常有用。视图实际上应该被视为表格。

      存储过程是“编译”的 sql 代码片段,因为它可以比随机的其他查询更优化地运行。存储过程中sql代码的执行计划已经构建好了,所以执行起来比普通的sql语句运行起来稍微顺畅一些。

      【讨论】:

        【解决方案6】:

        存储过程的主要优点是它们允许您合并逻辑(脚本)。此逻辑可能与 IF/ELSE 一样简单,也可能更复杂,例如 DO WHILE 循环、SWITCH/CASE。

        【讨论】:

          【解决方案7】:

          好吧,我会使用存储过程来更好地封装代码和控制权限。

          视图并不是真正的封装:它是一个扩展的宏。如果您很快开始加入视图,您将遇到一些可怕的查询。是的,他们可以加入,但他们不应该..

          也就是说,视图是一种有其位置的工具(例如索引视图),例如存储过程。

          【讨论】:

          • 这个答案对我来说非常重要。但我想知道,如何运行视图,因为我知道如何以 exec spName 运行存储的 proc。请指导我。
          • @Freelancer: SELECT * FROM View,就像一张桌子
          猜你喜欢
          • 1970-01-01
          • 2011-10-12
          • 1970-01-01
          • 2012-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          相关资源
          最近更新 更多