索引如何处理视图?

Sha*_*ica 17 sql sql-server indexing views indexed-view

有人可以用简单的英文向我解释一个视图的索引是如何工作的吗?我对表上的索引有一个相当简单的理解; 索引视图的工作方式与仅让底层表上的索引自然地完成它们的工作方式有何不同?

And*_*mar 10

假设您有一个将表限制为某些行的视图:

create view dbo.vw_HotProducts
as
select * from dbo.Products where Hot = 1
Run Code Online (Sandbox Code Playgroud)

现在,如果在此视图上创建索引,则索引仅包含热门产品.您可以将其与将结果存储在临时表中进行比较.这对于具有多个连接的复杂查询非常有用; 基本上他们的输出是缓存的.

索引视图的最大缺点是每次基础表数据更改时都会重新创建它们.这限制了索引视图对不经常更改的数据的使用,通常是在数据仓库或商业智能环境中.

  • @Andomar:在任何数据更改上重新创建索引视图都是不对的.SQL Server将修改实例化视图以反映对基表的任何更改.这就是为什么SQL Server对可以实现的视图设置了如此多的限制:很少聚合,没有外连接,没有联合,没有自连接等等.当然,它只通过INSERT/DELETE修改数据而不是UPDATE.但我已经看到在加入百万行表的OLTP应用程序中成功使用的索引视图.因人而异 (2认同)

S.L*_*ott 6

请参阅http://msdn.microsoft.com/en-us/library/aa258260(SQL.80).aspx

在视图上创建唯一的聚簇索引可提高查询性能,因为视图以与存储聚簇索引的表相同的方式存储在数据库中.

视图从适当的视图转换为表格.视图定义用于更新此表.

Oracle将这些称为"物化视图".

  • 并且由于索引视图现在确实是系统维护的表,因此还可以在其上创建其他非聚集索引 (2认同)

gbn*_*gbn 6

视图本身不是真实的或"持久的",并且没有性能优势.它只是一个扩展的宏.

添加索引并且它实际存在(持久化),因此优化器将考虑使用它.那不是宏观.

我确信Oracle称他们为"物化视图",这是一个更好的名称.

一个相关的FYI:一个计算列有一个PERSISTED选项,可以做同样的事情......