Sql-Server

跨長而寬的表傳輸數據的最佳實踐

  • March 15, 2021

作為我的數據倉庫項目的一部分,我將把數據從我們的 OLTP 傳輸到數據倉庫。有些表格又長又寬,很明顯,我只會轉移所需的列。

為了減少成本,我正在考慮對這些表進行數據跟踪,因此我們只查看更改的值而不是掃描整個表。不幸的是,我們的源系統在 SQL Server 2014 標準版上執行,而 CDC 是我們無法利用的選項。

有沒有比變更跟踪更好的替代方法?

您是否考慮過在源表中添加 ’’ rowversion ’’ 列?

考慮的最簡單方法rowversion(以前timestamp在 SQL Server 中)是數據庫範圍的自動編號。每個 INSERT 和 UPDATE 都會增加數據庫範圍的 rowversion。當關聯行被插入或更新時,任何定義了列的表都會rowversion將該列的值設置為數據庫行版本。

這是一個簡短的算法,您可以如何使用它:

  • 保存數據庫範圍的 rowversion 值(可通過@@DBTS; 即DataBase TimeStamp獲得)
  • 將您的數據處理到您的數據倉庫中
  • 下一次,僅處理rowversion值大於先前保存的行@@DBTS

請注意,雖然您不應遺​​漏任何應處理的行,但您可以重新處理行,而不會實際更改數據。這是因為rowversion每條UPDATE語句都會增加 d,即使數據是“ UPDATEd”到它的目前值並且實際上沒有改變。

此外,它無助於辨識哪些可能已更改。顧名思義,它嚴格在行級別工作。

對我來說,標準 SQL Server 版本有兩種可能的方式

  1. 創建觸發器以跟踪更改(您可以測試您的工作負載並查看觸發器是否會影響您的性能)

或者

  1. 假設您不需要近乎實時地將 OLTP 表傳輸到 DW 表,您可以每小時創建一個快照,然後有一個 CLR 儲存過程來計算快照數據庫和數據庫中感興趣的表的每一行雜湊值。目前數據庫,並使用主鍵快速找出更改的行,然後插入/更新/刪除相應的OLAP表。

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