Sql-Server
SQL Server 中的物化視圖
早在 2006 年我使用 SQL Server 以及我使用的許多其他數據庫(從那時起我就沒有接觸過這些數據庫)時,出現了一些小故障。
我需要創建一個物化視圖來快速訪問數據而不會使數據庫超載,而且還需要在創建視圖時將它們變為靜態的內容。
SQL Server 似乎支持帶有索引視圖的物化視圖,但要創建這些視圖,除其他事項外,還需要以下內容:
- WITH SCHEMABINDING 結構
- 聚集索引
失敗了,我的理解是視圖不是自動刷新,這可能是我需要的?
我的目標是獲得一個視圖,我可以隨時刷新。到目前為止,我在 SQL 2005 實例中創建了一個物化視圖,我可以使用以下語句訪問:
CREATE MATERIALIZED VIEW xys AS SELECT 123 FROM X WHERE ... GROUP BY
任何記憶複習?
思考需求:
- “在不使數據庫超載的情況下快速訪問數據”
- “把他們變成靜態的東西拉出來$$ at $$創建視圖的時間”
尤其是關於在某個時刻靜態擷取的數據的部分,我懷疑視圖是否是您想要的。我認為您可能想要更像CDC的東西,但直到 SQL Server 2008 才引入。對於 SQL Server 2005,數據庫快照可能滿足您的需求。
多米尼克的回答也可能是一種選擇。有多種方法可以滿足上述兩個要求。另一個範例可能是創建如下所示的儲存過程並通過 SQL Server 代理進行調度。例如假設源表:
CREATE TABLE SourceTable ( C1 [datatype1] PRIMARY KEY , C2 [datatype2] , C3 [datatype3] )
並創建一個“快照表”以匹配:
CREATE TABLE SnapshotOfSourceTable ( C1 [datatype1] PRIMARY KEY , C2 [datatype2] , C3 [datatype3] )
那麼你可以做這樣的事情:
CREATE PROCEDURE dbo.UpdateSnapshotOfSourceTable AS BEGIN BEGIN TRAN BEGIN TRY DELETE FROM SnapshotOfSourceTable WHERE C1 NOT IN ( SELECT C1 FROM SourceTable ) UPDATE Snap SET Snap.C2 = Source.C2 , Snap.C3 = Source.C3 FROM SnapshotOfSourceTable [Snap] INNER JOIN SourceTable [Source] ON Snap.C1 = Source.C1 INSERT INTO SnapshotOfSourceTable (C1, C2, C3) SELECT C1, C2, C3 FROM SourceTable WHERE C1 NOT IN ( SELECT C1 FROM SnapshotOfSourceTable ) COMMIT END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = 'Error when attempting to update snapshot table from source: ' + ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ) WITH LOG; ROLLBACK END CATCH END
對於這種需要,我喜歡建構一個 SSIS 包,它將視圖的內容複製到不同的 SQL DB(如果我想確保他們的報告不會損害 prod DB,則在不同的實例上)。
然後,您可以在需要時安排數據刷新,還可以創建索引,使他們的報告執行得更快。