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

Posted

技术标签:

【中文标题】如何在视图上实现聚集索引【英文标题】:how clustered index implemented on view 【发布时间】:2013-04-12 05:34:08 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

在许多情况下,人们认为任何旧视图都可以通过添加聚集索引来“加速”。这种情况很少见。通常,您创建一个索引视图来预先聚合某些计算,例如 SUM 或 COUNT_BIG。如果您创建一个不聚合的索引视图,因此具有与基表相同的行数/页数,那么您没有取得任何成果(当然,像任何事情一样,也有例外 - 视图上的索引可能是比基表更瘦,例如,导致页面更少)。

顺便说一句,您不能在视图上创建非聚集索引除非您首先创建了聚集索引。您还应该记住,就像表上的索引一样,索引视图不是免费的。虽然它可能会加快某些查询,但 SQL Server 必须在工作负载的整个 DML 部分维护索引。

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

【讨论】:

从您的第一行开始,当我们在视图上创建聚集索引时,该视图成为物化视图,或者我们只能在物化视图上创建聚集索引? 当您在其上创建聚集索引时,视图将变为具体化。 因为我在我的帖子中标记了 sql server,所以,我再问一个问题,sql server 是否有物化视图? 是的,但它被称为索引视图。 ok.. 表示与 oracle 中的物化视图具有相同的属性。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

您可以从this blog阅读更多内容。

【讨论】:

以上是关于如何在视图上实现聚集索引的主要内容,如果未能解决你的问题,请参考以下文章

为啥Sql Indexed View总是使用聚集索引

堆上的非聚集索引与聚集索引的性能 [关闭]

SQL Server 索引视图:无法创建聚集索引,因为选择列表包含聚合函数结果的表达式

SqlServer 创建聚集索引与非聚集索引处理千万条数据的优化,以及之间的区别

sqlserver数据库的索引视图和触发器

复合非聚集索引和覆盖索引有啥区别