“在线”更新索引视图

Vac*_*ano 7 index sql-server materialized-view sql-server-2012 online-operations

假设我有一个如下所示的索引视图:

ALTER VIEW dbo.MyIndexedView WITH SCHEMABINDING
AS 
    SELECT ord.SomeColumn, COUNT_BIG(*) AS Count
    FROM dbo.Ordered ord
    WHERE ord.CreatedWhen >  CONVERT(DATETIME, '2014-11-01', 121)
    GROUP BY ord.SomeColumn
GO

CREATE UNIQUE CLUSTERED INDEX [CIX_MyIndexedView] ON dbo.MyIndexedView (SomeColumn)
GO
Run Code Online (Sandbox Code Playgroud)

如果我在此视图中更改日期时间值(比如“2014-11-01”),则需要重新生成聚集索引。

有没有办法让现有的视图和索引保持有效,直到新的视图和索引完全构建,然后让它们交换? 相似Online=On

Aar*_*and 8

这是我将如何做到的。首先,创建几个备用模式:

CREATE SCHEMA HoldingTank AUTHORIZATION dbo;
CREATE SCHEMA Swapper AUTHORIZATION dbo;
Run Code Online (Sandbox Code Playgroud)

现在,当需要刷新视图并更改过滤谓词时,请在HoldingTank架构中创建它:

CREATE VIEW HoldingTank.MyIndexedView
WITH SCHEMABINDING
AS
  SELECT ...
GO

CREATE UNIQUE CLUSTERED INDEX [CIX_MyIndexedView]
ON HoldingTank.MyIndexedView(SomeColumn);
Run Code Online (Sandbox Code Playgroud)

现在,开始一个事务,并交换对象。

BEGIN TRANSACTION;
  ALTER SCHEMA Swapper TRANSFER dbo.MyIndexedView;
  ALTER SCHEMA dbo TRANSFER HoldingTank.MyIndexedView;
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

然后稍后您可以简单地从以下位置删除视图的旧副本Swapper

DROP VIEW Swapper.MyIndexedView;
Run Code Online (Sandbox Code Playgroud)

我在这些博客文章中详细介绍了此解决方案: