如果我们为视图创建索引,我们就将视图具体化。
为什么视图在被索引时会具体化?与非物化视图相对的意义是什么?
据我了解,正常的视图在物理上是不存在的。只存储它的定义,并且每次对视图的引用实际上都会重新执行视图定义。所以当我们通过视图插入时,我们直接插入到表中。这是对的吗 ?
如果视图被物化,它将成为一个带有数据的物理表。那么在这种情况下,对基表的修改是否不会在这个视图中更新(已经物化并且现在过着自己的生活)?
如果我们为视图创建索引,我们就将视图具体化。
为什么视图在被索引时会具体化?与非物化视图相对的意义是什么?
据我了解,正常的视图在物理上是不存在的。只存储它的定义,并且每次对视图的引用实际上都会重新执行视图定义。所以当我们通过视图插入时,我们直接插入到表中。这是对的吗 ?
如果视图被物化,它将成为一个带有数据的物理表。那么在这种情况下,对基表的修改是否不会在这个视图中更新(已经物化并且现在过着自己的生活)?
让我们考虑一下带有聚集索引的表。当您选择集群键时,SQL Server 会创建 ab 树,其叶子是实际数据。非聚集索引的工作方式相同,除了叶节点是代表聚集键的元组(因此您可以遍历聚集索引并返回实际数据)。
扩展这个例子,当你索引一个视图时,你首先需要提供一个聚集索引。您希望在该指数的叶子上生活什么?当然是数据!:) 视图上的任何非聚集索引的行为都与物理表上的类似物完全相同。
至于您关于物化视图变得陈旧的问题,事实并非如此。也就是说,SQL Server 知道视图依赖于表(这就是为什么视图需要绑定架构,这样您就不能删除其组成表之一),因此针对组成表的任何 DML 操作也会反映在桌子。您可以通过创建索引视图然后查看对基础表之一进行简单更新的查询计划来说服自己。您应该会看到索引视图的相应更新。
为方便起见,视图只是一个保存并可从中选择的选择语句。通过视图插入/更新确实会直接进入表以执行其操作。
索引视图被存储、索引,就像一个表一样。