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

时间:2011-01-19 15:59:24

标签: sql sql-server database-design indexing

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

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

基础表上的索引似乎是最重要的索引。那你为什么要在视图上有一个单独的索引?

4 个答案:

答案 0 :(得分:34)

如果视图已编制索引,则只能使用索引回答的任何查询都不需要引用基础表。这可以带来性能的巨大提升。

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

这是数据库期刊中的一个好article

答案 1 :(得分:4)

  

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

加快查询速度。

  

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

并非总是如此。

通过在视图上创建聚簇索引,可以实现视图,对基础表的更新可以物理更新视图。针对此视图的查询可能会也可能不会访问基础表。

并非所有观点都可以编入索引。

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

答案 2 :(得分:3)

以下链接提供了比我能说的更好的信息,尤其是在性能提升下的部分。希望它有所帮助

http://technet.microsoft.com/en-us/library/cc917715.aspx

答案 3 :(得分:0)

您在视图上创建索引的原因与基表上的原因相同:提高针对该视图的查询性能。这样做的另一个原因是实现了一些您无法针对基表实现的唯一性约束。遗憾的是,SQL Server不允许在视图上创建约束。