I can create clustered or non-clustered index on view and SQL SERVER says, we can have multiple non-clustered index (max 249), but only one clustered index exist on table or view. Because, records are sorted, where they physically stored and we can't have multiple sorting order. So, my question is, since View doesn't physically stored in database. Then, what if I create clustered index on view and base table already exist clustered index. How clustered index implemented on view ? How clustered index works and useful on view ?
3 回答
视图只是一个没有具体化数据的存储查询,除非它有一个聚集索引。
在许多情况下,人们认为任何旧视图都可以通过添加聚集索引来“加速”。这种情况很少见。通常,您创建一个索引视图来预先聚合某些计算,例如 SUM 或 COUNT_BIG。如果您创建一个不聚合的索引视图,因此具有与基表相同的行数/页数,那么您没有取得任何成果(当然,像任何事情一样,也有例外 - 视图上的索引可能是例如,比基表更瘦,从而导致页面更少)。
顺便说一句,您不能在视图上创建非聚集索引,除非您首先创建聚集索引。您还应该记住,就像表上的索引一样,索引视图不是免费的。虽然它可能会加快某些查询,但 SQL Server 必须在工作负载的整个 DML 部分维护索引。
视图上的聚集索引基本上是一个新表,当引用的表发生更改时会自动更新。因此,您使用预先收集的数据购买了更快的访问时间,但您支付的存储使用量要高得多(在许多情况下是两倍)。
当我们向视图添加唯一聚集索引时,我们将其“物化”。换句话说,“虚拟表”保存在磁盘上,具有自己的页面结构,我们可以将其视为普通表。由索引视图定义的任何聚合现在都是预先计算的,并且任何连接都是预先连接的,因此引擎不再需要在执行时执行此工作。SQL Server 为索引视图创建不同于基础表的统计信息,以优化基数估计。
您可以从此博客中阅读更多内容。