如何在视图上创建聚簇索引

时间:2009-08-26 15:51:21

标签: sql-server sql-server-2008

如何在SQL Server 2008中的视图上创建聚簇索引。 视图不是真正的表,因此聚集索引创建的数据的物理排列没有任何意义。

我在哪里错过了这一点?

3 个答案:

答案 0 :(得分:3)

索引始终存在于磁盘上。创建索引时,即使视图本身不是“真正的”行,也要实现磁盘上视图的行。

MSDN White paper并附上解释

答案 1 :(得分:2)

虽然视图不是真实对象,但聚集索引是。

视图返回的行可以进行排序和存储。

但是,为了可索引,视图应该满足许多条件。

大多数情况下,他们确保结果是持久的,并且可以在视图中轻松跟踪基础表的更新(以便每次更新基础表时都不必重建索引)。

例如,SUM(*)COUNT_BIG(*)是分配函数:

SUM(set1) + SUM(set2) = SUM(set1 + set2)
COUNT_BIG(set1) + COUNT_BIG(set2) = COUNT_BIG(set1 + set2)

,因此在更改表时,只使用视图行和受影响列的值重新计算SUMCOUNT_BIG的值很容易。

但是,其他聚合不是这种情况,因此不允许在索引视图中使用它们。

答案 2 :(得分:2)

这是一个有点简化的解释。引擎盖下有很多技术性的东西,但听起来你想要一个普遍的“wassup”解释。

视图本质上是预先编写和存储的查询;无论何时访问视图,您都会检索并将预先编写的查询插入当前查询中。 (至少这是我的想法。)

因此,这些“基本”视图读取存储在数据库/硬盘驱动器上已存在的表中的数据。在视图上构建聚簇索引时,您实际所做的是制作视图引用的数据的第二个物理副本。例如,如果您有表A,请将view vA创建为“select * from A”,然后在该视图上构建聚簇索引,最终得到的是硬盘驱动器上的两个数据副本。

如果表A非常大,并且您希望快速访问表的一小部分(例如只有2-3列,或者只有Status = 1,或者您希望快速访问数据),这可能很有用这需要一个丑陋的联接来产生。)

当您更新表A(实际上是视图引用的任何表)时,有趣的是,因为“base”表的任何更改也必须对“view”表进行。在频繁使用的OLTP系统中不是一个好主意。

仅供参考,我相信SQL的“索引视图”在Oracle中称为“物化视图”。对于我的钱,Materialized View是一个更好的名称/描述。