索引如何作用于视图?

Posted

技术标签:

【中文标题】索引如何作用于视图?【英文标题】:How do indexes work on views? 【发布时间】:2010-12-15 20:09:53 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

create view dbo.vw_HotProducts
as
select * from dbo.Products where Hot = 1

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

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

【讨论】:

我们可以基于视图的(非键)列创建索引吗? @Q8-coder:视图上的索引必须是聚集的且唯一的。所以可以选择非键列,只要在视图结果中唯一标识一行即可 @Andomar:在任何数据更改时重新创建索引视图是不正确的。 SQL Server 将修改物化视图以反映对基表的任何更改。这就是为什么 SQL Server 对可以具体化的视图设置如此多的限制:很少的聚合、没有外连接、没有联合、没有自连接等。当然,它只通过 INSERT/DELETE 而不是 UPDATE 修改数据。但我已经看到在连接百万行表的 OLTP 应用程序中成功使用了索引视图。 YMMV @Tadmas:有趣的评论!我们在 OLTP 中使用索引视图进行的测试很糟糕,但现在可能有所改进。 +1 + answer credit - 给出最有用的解释。谢谢!【参考方案2】:

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

创建一个唯一的聚集索引 视图提高查询性能 因为视图存储在 数据库以相同的方式与表 存储聚集索引。

视图从正确的视图转换为表格。视图定义用于更新此表。

Oracle 将这些称为“物化视图”。

【讨论】:

并且由于索引视图现在确实是系统维护的表,因此还可以在其上创建额外的非聚集索引 看起来您创建的第一个索引必须是唯一的并且是聚集的以定义缓存表。附加索引可以是非唯一的,就像 marc_s 说的那样!【参考方案3】:

视图本身不是真实的或“持久的”,并且没有性能优势。简直就是一个宏that's expanded.

添加一个索引并且它物理存在(持久化),所以优化器会考虑使用它。那它就不是宏了。

我确信 Oracle 称它们为“物化视图”,这是一个更好的名称。

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

【讨论】:

以上是关于索引如何作用于视图?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 索引视图匹配与连接不起作用的视图

mysql-视图及索引简介

SQL Server 索引(index) 和 视图(view) 的简单介绍和操作

MySQL-视图和索引

SQL Server索引视图以(物化视图)及索引视图与查询重写

索引页面不起作用,但 api 适用于 AWS beanstalk Spring Boot