Sql-Server
跨長而寬的表傳輸數據的最佳實踐
作為我的數據倉庫項目的一部分,我將把數據從我們的 OLTP 傳輸到數據倉庫。有些表格又長又寬,很明顯,我只會轉移所需的列。
為了減少成本,我正在考慮對這些表進行數據跟踪,因此我們只查看更改的值而不是掃描整個表。不幸的是,我們的源系統在 SQL Server 2014 標準版上執行,而 CDC 是我們無法利用的選項。
有沒有比變更跟踪更好的替代方法?
您是否考慮過在源表中添加 ’’ rowversion ’’ 列?
考慮的最簡單方法
rowversion
(以前timestamp
在 SQL Server 中)是數據庫範圍的自動編號。每個 INSERT 和 UPDATE 都會增加數據庫範圍的 rowversion。當關聯行被插入或更新時,任何定義了列的表都會rowversion
將該列的值設置為數據庫行版本。這是一個簡短的算法,您可以如何使用它:
- 保存數據庫範圍的 rowversion 值(可通過
@@DBTS
; 即DataBase TimeStamp獲得)- 將您的數據處理到您的數據倉庫中
- 下一次,僅處理
rowversion
值大於先前保存的行@@DBTS
請注意,雖然您不應遺漏任何應處理的行,但您可以重新處理行,而不會實際更改數據。這是因為
rowversion
每條UPDATE
語句都會增加 d,即使數據是“UPDATE
d”到它的目前值並且實際上沒有改變。此外,它無助於辨識哪些列可能已更改。顧名思義,它嚴格在行級別工作。
對我來說,標準 SQL Server 版本有兩種可能的方式
- 創建觸發器以跟踪更改(您可以測試您的工作負載並查看觸發器是否會影響您的性能)
或者
- 假設您不需要近乎實時地將 OLTP 表傳輸到 DW 表,您可以每小時創建一個快照,然後有一個 CLR 儲存過程來計算快照數據庫和數據庫中感興趣的表的每一行雜湊值。目前數據庫,並使用主鍵快速找出更改的行,然後插入/更新/刪除相應的OLAP表。