我正在使用 SQL Server 2000,我犹豫是否开始使用索引视图(我有一个包含每日性能值的表,我需要用许多数学函数对它们进行评分)。
如果我创建一个索引视图(使用我的性能表),然后在我的性能表中添加一个新行,我的视图索引是立即更新,还是在视图的第一个用户请求时更新?
我正在使用 SQL Server 2000,我犹豫是否开始使用索引视图(我有一个包含每日性能值的表,我需要用许多数学函数对它们进行评分)。
如果我创建一个索引视图(使用我的性能表),然后在我的性能表中添加一个新行,我的视图索引是立即更新,还是在视图的第一个用户请求时更新?
索引视图作为影响它们所基于的基表的查询的一部分自动维护。
这就是为什么对索引视图中的内容有这么多限制的原因 - 存在这些限制以便可以仅根据基表中受影响的行来更新视图,而不是(可能)必须重新扫描整个表来确定视图现在应该包含哪些行。
您还可以通过检查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)
计划insert into T(ID) values (1)
是:
如您所见,该计划包括一个插入到 index I
on viewV
中。
以上是在比 2000 更新的 SQL Server 版本上完成的(我不会一直潜伏不受支持的版本),但它们一直都是这样工作的。甚至在 2000 版本的文档中,也提到了这个限制:
创建聚集索引后,任何尝试修改视图基础数据的连接也必须具有创建索引所需的相同选项设置。如果执行语句的连接没有正确的选项设置,SQL Server 会生成错误并回滚任何会影响视图结果集
INSERT
的语句UPDATE
。DELETE
如果视图仅在访问时更新,则不需要存在此限制。