2012-03-15 43 views
4

嗨,我们有一个存储的过程,每天安排一个过滤后从具有大量数据的表中获取记录。我的问题是如果我在表上创建一个视图,并从视图中获取数据将这是更快的过程还是更慢?更快地从视图或表格中提取数据?

回答

6

标准视图,它不应该有任何区别,因为内部SQL只是扩展到查询中。请注意,内联表值用户定义的函数(认为“参数化视图”)也适用。

但是,如果您将其设置为indexed view,则可以看到性能提高。

0

只是补充@AdaTheDev答案:对于多语句表值函数

the same applies with table-valued user defined functions 

这就是内联表值函数真实的,但不是100%正确的。第二种类型的功能将使用更多的资源(内存)比第一个

关于索引视图,它可以帮助,但记住,它可以大大会增加你的存储空间

+0

好的,我确实是指内联UDF!我会更新我的答案,因为这是非常重要的一点 – AdaTheDev 2012-03-15 12:15:25

3

只要记住,视图只不过是一个选择语句(索引视图不同)。如果您有:

SELECT * FROM TABLE 

这是一个过程,如果你把同样的事情在一个视图,然后做:

SELECT * FROM VIEW 

内的流程,在这两者之间绝对没有区别。但是,如果事情变得更加复杂,以至于你加入了很多桌子,那么这取决于他们如何被访问。例如,如果您创建一个访问6个表的视图,然后编写一个查询,只需从这些表中的3个中提取数据,那么您可能会从优化过程中发生的称为简化的过程中受益,你会看到一个只引用3个表的计划。但是,你可能不会。如果不是,则针对3个表编写的查询通常比针对访问多于3个表的视图的计划运行得更快。

如果您开始嵌套视图,具有调用视图或加入视图的视图,则可能会看到非常严重的性能下降。

一般来说,如果你使用存储过程,我建议你直接写你的查询表。它不会损害性能,它可以帮助您避免嵌套视图和计划简化问题。