嗨我们有一个存储过程,它是按日计划的,它在过滤后从具有大量数据的表中获取记录。我的问题是,如果我在表上创建一个视图并从视图中获取数据,这将是更快的过程还是更慢?
答案 0 :(得分:6)
标准视图,它不应该有任何区别,因为内部SQL只是扩展到查询中。注意,同样适用于内联表值用户定义函数(想想“参数化视图”)。
但是,如果您将其设为indexed view,那么您可以看到性能提升。
答案 1 :(得分:3)
请记住,视图只是一个select语句(索引视图不同)。如果你有:
SELECT * FROM TABLE
这是一个程序,如果你在视图中放置相同的东西,然后做了:
SELECT * FROM VIEW
在一个程序中,这两者之间绝对没有区别。但是,如果事情变得更加复杂,以至于你加入了很多表,那么它实际上取决于它们是如何被访问的。
例如,如果您创建一个访问6个表的视图,然后编写一个只需要从其中3个表中提取数据的查询,您就可以从优化过程中发生的称为简化的过程中受益。会看到一个只引用3个表格的计划。但是,你可能不会。如果没有,那么针对3个表编写的查询通常比针对访问3个表的视图的计划运行得更快。
如果您开始嵌套视图,拥有调用视图或加入视图的视图,那么您可能会看到非常严重的性能下降。
通常,如果您正在使用存储过程,我建议您直接针对表编写查询。它根本不会损害性能,它可以帮助您避免嵌套视图和计划简化的问题。
答案 2 :(得分:0)
只是补充@AdaTheDev答案:
the same applies with table-valued user defined functions
对于内联表值函数是正确的,但对于多语句表值函数则不是100%true。第二种类型的函数将使用比第一种类型更多的资源(内存)
关于索引视图,它可以提供帮助,但请记住,它可以大大增加您的存储空间