Aktualisieren Sie eine indizierte Ansicht "Online"

7

Angenommen, ich habe eine indizierte Ansicht, die folgendermaßen aussieht:

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

Wenn ich den Datums- / Uhrzeitwert in dieser Ansicht ändere (z. B. '2014-11-01'), muss der Clustered-Index neu generiert werden.

Gibt es eine Möglichkeit, die vorhandene Ansicht und den vorhandenen Index so lange beizubehalten, bis die neue vollständig erstellt ist, und sie dann auszutauschen? Ähnlich zuOnline=On

Vaccano
quelle

Antworten:

8

Hier ist, wie ich es machen würde. Erstellen Sie zunächst einige Ersatzschemata:

CREATE SCHEMA HoldingTank AUTHORIZATION dbo;
CREATE SCHEMA Swapper AUTHORIZATION dbo;

Wenn Sie die Ansicht aktualisieren und das Filterprädikat ändern möchten, erstellen Sie sie im HoldingTankSchema:

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

CREATE UNIQUE CLUSTERED INDEX [CIX_MyIndexedView]
ON HoldingTank.MyIndexedView(SomeColumn);

Starten Sie nun eine Transaktion und tauschen Sie die Objekte aus.

BEGIN TRANSACTION;
  ALTER SCHEMA Swapper TRANSFER dbo.MyIndexedView;
  ALTER SCHEMA dbo TRANSFER HoldingTank.MyIndexedView;
COMMIT TRANSACTION;

Zu einem späteren Zeitpunkt können Sie dann einfach die alte Kopie der Ansicht löschen aus Swapper:

DROP VIEW Swapper.MyIndexedView;

Ich gehe in diesen Blog-Beiträgen ausführlicher auf diese Lösung ein:

Aaron Bertrand
quelle