如何在视图上实现聚集索引

时间:2013-04-18 22:36:26

标签: sql-server view indexing clustered-index indexed-view

我可以在视图上创建聚簇索引或非聚簇索引,SQL SERVER说,我们可以有多个非聚集索引(最大249),但表或视图上只存在一个聚簇索引。因为,记录被排序,它们在物理上存储的地方,我们不能有多个排序顺序。所以,我的问题是,因为View没有物理存储在数据库中。那么,如果我在视图和基表上创建聚簇索引已经存在聚簇索引。如何在视图上实现聚集索引?聚集索引如何工作并在视图上有用?

3 个答案:

答案 0 :(得分:5)

视图只是一个没有物化数据的存储查询,除非它有一个聚集索引。

在许多情况下,人们认为通过添加聚集索引可以“加速”任何旧视图。这种情况很少发生。通常,您创建索引视图以预先聚合某些计算,例如SUM或COUNT_BIG。如果你创建一个没有聚合的索引视图,因此与基表具有相同数量的行/页面,你还没有实现任何目标(当然,有任何例外,有例外 - 视图上的索引可能是比基表更瘦,例如,导致更少的页面。)

另外,除非首先创建聚簇索引,否则无法在视图上创建非聚集索引。您还应该记住,与表上的索引一样,索引视图是免费的。虽然它可能会加快某些查询速度,但SQL Server必须在整个工作负载的DML部分维护索引。

您真的应该阅读documents like this one,其中详细介绍了索引视图的性能优势,以及this one,其中记录了限制和限制等。

答案 1 :(得分:4)

视图上的聚簇索引基本上是一个新表,当引用的表发生更改时,它会自动更新。因此,您可以使用预先收集的数据购买更快的访问时间,但是您支付的存储使用率要高得多(在许多情况下为两倍)。

答案 2 :(得分:0)

当我们向视图添加唯一的聚簇索引时,我们'实现'它。换句话说,'虚拟表'持久存储到磁盘,具有自己的页面结构,我们可以像普通表一样对待它。现在预先计算由索引视图定义的任何聚合,并且任何连接都是预先连接的,因此引擎不再需要在执行时执行此工作。 SQL Server为索引视图创建统计信息,不同于基础表的统计信息,以优化基数估计。

您可以从this blog了解更多信息。