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
这是我将如何做到的。首先,创建几个备用模式:
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)
我在这些博客文章中详细介绍了此解决方案:
归档时间: |
|
查看次数: |
76 次 |
最近记录: |