【问题标题】:SQL Server SELECT from non-indexed view which references an indexed tableSQL Server SELECT 从引用索引表的非索引视图
【发布时间】:2012-01-27 15:18:58
【问题描述】:

如果我从非索引视图中选择,并且视图从索引表中选择,sql server 将使用索引还是我必须索引视图。

【问题讨论】:

  • 可能但唯一知道的方法是查看执行计划

标签: sql sql-server reporting-services indexing ssrs-2008


【解决方案1】:

如果 SQL Server 决定有助于查询时间,它将使用索引。没有必要仅仅为了让您的表索引在视图中工作而创建 indexed 视图!

相反,索引视图允许您在派生(和非派生)数据上创建索引,这在某些情况下可以提供巨大的性能提升。

【讨论】:

    【解决方案2】:

    是的,当您从简单视图(非持久性)中进行选择时,SQL Server 会使用视图的查询来创建计划。

    所以如果你有这样的看法:

    create view1 as
    select ID, name from table1
    

    你做到了:

    select ID, name from view1
    

    在内部,它与做的完全一样

    select ID, name from table1
    

    【讨论】:

      【解决方案3】:

      如果我从非索引视图中选择,并且视图从索引视图中选择 表,

      这是不可能的。

      看,视图没有被索引一个普通的甚至不存在——它是一个在执行时被扩展的宏。所以最后你从索引表中查询。

      除非您将视图具体化(完全不同的高级主题),否则视图仅靠捷径。

      【讨论】:

      • SQL Server 确实有“索引视图”,类似于 oracle 的物化视图。
      • FWIW Indexed View 是 SQL Server 的正确术语。物化视图将是 Oracle 术语
      • +1 因为这是正确的:视图像宏一样扩展(如I keep saying)并且考虑了基础表。优化器不会将视图本身视为一个实体。
      【解决方案4】:

      如果我没记错的话,它将使用索引来创建视图,但针对视图的查询不使用索引。不过,在谈论视图索引时,有很多考虑因素。

      查看此链接了解 sql server 索引视图的所有细节

      http://msdn.microsoft.com/en-us/library/aa933148(v=sql.80).aspx

      【讨论】:

      • 如果您要投反对票,请至少添加一条评论,以便我理解原因。据我所知,我的答案中没有任何内容是不正确的,并且在向 sql server 中的视图添加索引时,操作确实需要考虑很多事情。
      • 如果索引存在于基表上,如果优化器确定它有帮助,针对视图的查询将使用该索引。这是一个演示代码示例:pastebin.com/Bcq9nHvX
      猜你喜欢
      • 2012-03-01
      • 2011-02-16
      • 2011-07-16
      • 2011-11-30
      • 2018-05-08
      • 1970-01-01
      • 2012-02-18
      • 2012-10-01
      相关资源
      最近更新 更多