存储过程与查看

时间:2010-09-22 20:18:32

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

我已经使用了两者,但我不清楚的是我何时应该优先选择其中一种。我的意思是我知道存储过程可以接受参数......但是我们仍然能够使用Views执行相同的操作吗?

因此,考虑到表现和其他方面何时以及为什么我更喜欢一个而不是另一个?

7 个答案:

答案 0 :(得分:35)

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

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

如果说,视图是一个有位置的工具(例如索引视图),就像存储过程一样。

答案 1 :(得分:19)

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

答案 2 :(得分:13)

一个View就像一个保存的查询语句,它不能包含复杂的逻辑或多个语句(除了使用union等)。对于任何复杂或可通过参数自定义的内容,您可以选择存储过程,从而提供更大的灵活性。

在数据库体系结构中使用视图和存储过程的组合是很常见的,并且可能由于非常不同的原因。有时,当重新设计模式时,可以在sprocs中实现向后兼容性,有时使数据与本机存储在表中的方式相比更具可操作性(de-noramlized视图)。

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

将Views视为表,而不是存储过程。

答案 3 :(得分:12)

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

答案 4 :(得分:5)

我将存储过程的使用与发送/接收数据库之间的事务的需要联系起来。也就是说,每当我需要将数据发送到我的数据库时,我都使用存储过程。当我想更新数据或查询数据库以获取我的应用程序中使用的信息时,情况也是如此。

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

答案 5 :(得分:4)

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

存储过程是“编译”的sql代码片段,就像在哪里一样,比其他随机查询运行得更优化。已经构建了存储过程中sql代码的执行计划,因此执行运行比普通sql语句略微平滑。

答案 6 :(得分:0)

两个理由。

如果您不希望插入,请使用存储过程而不是查看。在视图中插入可能无法给出它似乎做的事情。它将插入一个表中,一行可能与视图中的查询不匹配,一行将不会出现在视图中;插入某个地方,但不是声明所在的地方。

如果你不能使用另一个存储过程的存储过程的结果,那就使用一个视图(我从来没有能够使后者工作,至少对MySQL来说是这样。)