为什么要在视图上放置索引?

Sli*_*345 38 sql sql-server indexing database-design

Microsoft SQL Server允许您向视图添加索引,但为什么要这样做呢?

我的理解是一个视图实际上只是一个子查询,即,如果我说SELECT*FROM myView,我真的说SELECT*FROM(myView的查询)

看起来基础表上的索引将是最重要的索引.那你为什么要在视图上有一个单独的索引呢?

Lar*_*tig 37

如果视图已编制索引,那么任何只能使用索引回答的查询将永远不需要引用基础表.这可以导致性能的巨大改进.

本质上,数据库引擎在更新基础表时维护查询的"已解决"版本(或者更确切地说是查询的索引),然后在可能的情况下使用该解析的版本而不是原始表.

这是Database Journal中的一篇文章.

  • +1:人们认为非物化视图存储信息,但它实际上只是物化视图(支持IE:Not MySQL或PostgreSQL)视图. (3认同)

Qua*_*noi 6

Microsoft SQL Server 允许您向视图添加索引,但为什么要这样做呢?

加快查询速度。

我的理解是视图实际上只是一个子查询,即,如果我说 SELECT * FROM myView,我实际上是在说 SELECT * FROM (myView's Query)

不总是。

通过在视图上创建聚集索引,您可以具体化视图,并且对基础表的更新以物理方式更新视图。针对此视图的查询可能会也可能不会访问基础表。

并非所有视图都可以编入索引。

例如,如果您GROUP BY在视图中使用,为了使其可索引,它应该包含 aCOUNT_BIG并且其中的所有聚合函数都应该分布UNION ALL(仅SUM并且COUNT_BIG实际上是)。这是索引可维护所必需的,并且对基础表的更新可以及时更新视图。

  • @HLGEM:是的,还有我没有在这里提到的更多限制“2465”。 (5认同)
  • @HLGEM:好吧,也许是`2466`,但我不确定。 (4认同)
  • 我以为还有更多。 (2认同)