【问题标题】:When is an indexed view updated?索引视图何时更新?
【发布时间】:2014-06-24 12:26:47
【问题描述】:

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

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

【问题讨论】:

  • 请注意,索引视图直到 SQL Server 2008 才可用。我怀疑您使用的是 2000! docs.microsoft.com/en-us/sql/relational-databases/views/…
  • @kristianp - 只是重新访问旧答案并看到您的评论 - 正如您在我的回答中看到的那样,我当时链接到 2000 版本的文档,其中包括现有索引视图施加的限制.您的链接指向较新的文档 - 请注意,在此类文档中,MS 有时会说“自...支持”并列出版本号,但他们将其更新为仅引用该产品的最新支持版本。
  • @Damien_The_Unbeliever,感谢您的纠正。当我查看我发布的链接时,我看不到支持何时开始,所以在我查看它时可能是文档中的一个错误。

标签: sql-server indexed-view


【解决方案1】:

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

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


您还可以通过检查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) 的计划是:

如您所见,该计划包括在索引I 中插入视图V


以上是在比 2000 更新的 SQL Server 版本上完成的(我不会一直潜伏不受支持的版本),但这是它们一直工作的方式。甚至早在 2000 版的 documentation 中,也提到了这个限制:

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

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

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 2019-01-23
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2011-10-05
    • 2016-01-19
    相关资源
    最近更新 更多