【问题标题】:Faster fetching data from View or Table?从视图或表中更快地获取数据?
【发布时间】:2012-03-15 11:01:27
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      SELECT * FROM TABLE
      

      那是在一个过程中,如果你把同样的东西放在一个视图中然后做了:

      SELECT * FROM VIEW
      

      在一个过程中,这两者绝对没有区别。但是,如果事情变得更复杂,以至于你要加入很多表,那么这真的取决于它们是如何被访问的。

      例如,如果您创建一个访问 6 个表的视图,然后编写一个只需要从其中 3 个表中提取数据的查询,您可能会从优化过程中发生的称为简化的过程中受益,并且您'将看到一个仅引用 3 个表的计划。但是,您可能不会。如果不是,那么针对 3 个表编写的查询通常会比针对访问超过 3 个表的视图的计划运行得更快。

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

      一般来说,如果您使用存储过程,我建议您直接针对表编写查询。它根本不会影响性能,并且可以帮助您避免嵌套视图的问题并简化计划。

      【讨论】:

        【解决方案3】:

        只是补充@AdaTheDev 答案:

        the same applies with table-valued user defined functions
        

        这对于内联表值函数是正确的,但对于多语句表值函数来说不是 100% 正确。第二种类型的函数将使用比第一种更多的资源(内存)

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

        【讨论】:

        • 很好,我确实是指内联 UDF!我会更新我的答案,因为这是非常重要的一点
        猜你喜欢
        • 1970-01-01
        • 2018-04-16
        • 1970-01-01
        • 2018-10-21
        • 2021-04-28
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 2017-10-16
        相关资源
        最近更新 更多