索引视图何时更新?

Fra*_*ste 6 sql-server indexed-view

我正在使用 SQL Server 2000,我对开始使用索引视图犹豫不决(我有一个包含日常性能值的表,我需要用许多数学函数对它们进行评分)。

如果我创建一个索引视图(使用我的性能表),然后在我的性能表中添加一个新行,我的视图索引是立即更新,还是在视图上的第一个用户请求时更新?

Dam*_*ver 8

索引视图作为影响它们所基于的基表的查询的一部分自动维护。

这就是为什么对索引视图中可以拥有的内容有如此多的限制 - 存在限制以便可以仅根据基表中受影响的行更新视图,而不是(可能)必须重新扫描整个表来确定视图现在应该包含哪些行。


您还可以通过检查INSERT以下查询的查询计划来看到这一点:

create table dbo.T (ID int not null)
go
create view dbo.V 
with schemabinding
as
    select ID from dbo.T
go
create unique clustered index I on dbo.V(ID)
go
insert into T(ID) values (1)
Run Code Online (Sandbox Code Playgroud)

计划insert into T(ID) values (1)是:

在此处输入图片说明

如您所见,该计划包括I对 view索引的插入V


以上是在比 2000 更新的 SQL Server 版本上完成的(我不保留不受支持的版本),但这是它们一直工作的方式。即使在 2000 版本的文档中,也提到了这个限制:

创建聚集索引后,任何尝试修改视图基础数据的连接也必须具有创建索引所需的相同选项设置。如果执行语句的连接没有正确的选项设置INSERT,SQL Server 会生成错误并回滚任何会影响视图结果集的、UPDATE、 或DELETE语句。

如果视图仅在访问时更新,则不需要存在此限制。