【发布时间】:2012-03-15 11:01:27
【问题描述】:
您好,我们有一个存储过程,它每天安排在过滤后从具有大量数据的表中获取记录。我的问题是,如果我在表上创建一个视图并从视图中获取数据,这会更快还是更慢?
【问题讨论】:
标签: sql sql-server sql-server-2008 sql-server-2005
您好,我们有一个存储过程,它每天安排在过滤后从具有大量数据的表中获取记录。我的问题是,如果我在表上创建一个视图并从视图中获取数据,这会更快还是更慢?
【问题讨论】:
标签: sql sql-server sql-server-2008 sql-server-2005
一个标准视图,它不应该有任何区别,因为内部 SQL 只是扩展到查询中。请注意,这同样适用于 内联 表值用户定义函数(想想“参数化视图”)。
但是,如果您将其设为 indexed view,则可以看到性能提升。
【讨论】:
请记住,视图只不过是一个选择语句(索引视图不同)。如果你有:
SELECT * FROM TABLE
那是在一个过程中,如果你把同样的东西放在一个视图中然后做了:
SELECT * FROM VIEW
在一个过程中,这两者绝对没有区别。但是,如果事情变得更复杂,以至于你要加入很多表,那么这真的取决于它们是如何被访问的。
例如,如果您创建一个访问 6 个表的视图,然后编写一个只需要从其中 3 个表中提取数据的查询,您可能会从优化过程中发生的称为简化的过程中受益,并且您'将看到一个仅引用 3 个表的计划。但是,您可能不会。如果不是,那么针对 3 个表编写的查询通常会比针对访问超过 3 个表的视图的计划运行得更快。
如果您开始嵌套视图、拥有调用视图或加入视图的视图,那么您可能会看到非常严重的性能下降。
一般来说,如果您使用存储过程,我建议您直接针对表编写查询。它根本不会影响性能,并且可以帮助您避免嵌套视图的问题并简化计划。
【讨论】:
只是补充@AdaTheDev 答案:
the same applies with table-valued user defined functions
这对于内联表值函数是正确的,但对于多语句表值函数来说不是 100% 正确。第二种类型的函数将使用比第一种更多的资源(内存)
关于索引视图,它可以提供帮助,但请记住,它会大大增加您的存储空间
【讨论】: