Sql-Server

SQL Server 中的物化視圖

  • June 29, 2020

早在 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,則在不同的實例上)。

然後,您可以在需要時安排數據刷新,還可以創建索引,使他們的報告執行得更快。

引用自:https://dba.stackexchange.com/questions/270066