Sql-Server

不刪除更改表中的 CDC 記錄有哪些缺點?

  • August 21, 2019

如果我做這樣的事情

USE AdventureWorks2012;
GO  
EXECUTE sys.sp_cdc_change_job   
   @job_type = N'cleanup',  
   @retention = 52494800; -- (100 years)
GO 

更改表中的記錄永遠不會被刪除(直到 2119 年)。

另外,每次將新列添加到跟踪表時,我都會應用這樣的腳本將數據從舊實例移動到新實例,並且我知道如果有很多記錄,可能需要一點是時候將它們複製到新的更改表中了。

因此,我計劃將更改歷史記錄永久保存在這些更改表上,並且永遠不要使用清理作業清除這些表。但是文件說

如果您不定期系統地修剪數據,儲存在更改表中的數據將無法管理地增長

如果 CDC 從 2007 年開始就在我的數據庫中,最大的常見更改表將在 12 年內包含約 20K 行,源表被複製到另一台伺服器,所以,話雖如此:

  • “無法控制地增長”對我意味著什麼?

  • 它會對數據庫中的性能或儲存產生非常負面的影響嗎?也許對複制性能有影響?

  • 我在沒有清理工作的情況下做 CDC 就可以了嗎?或者

  • 使用 SSIS 包或執行儲存過程的作業將數據複製到報告數據庫是更好的選擇嗎?

    • 如果是這樣,是否有一種簡單的方法可以根據更改表中添加的新列來處理在目標表中創建新列?
  • 如果一個更改表中有 100 萬行而不是 20K 行,答案是否會改變?

“變得難以管理”對我意味著什麼?

這一切都取決於您的環境。如果您有一個受大量事務處理的數據庫(一個具有大量 CRUD 操作的數據庫),那麼該表的增長速度將比一個更改最少的表增長得更快且更大,從而使其更難管理。

它會對數據庫中的性能或儲存產生非常負面的影響嗎?也許對複制性能有影響?

更改表越大,用於在另一個實例上儲存數據的 ETL / 更改數據查詢函式執行時間就越長(它們會更慢)。您沒有說您將這些記錄儲存在其他地方,或者只是使用更改表作為您的審計終點,但似乎是後者。

我在沒有清理工作的情況下做 CDC 就可以了嗎?

如果您的更改表預計不會增長 > 20K 行,您可能不會看到性能負擔。

使用 SSIS 包或執行儲存過程的作業將數據複製到報告數據庫是更好的選擇嗎?如果是這樣,是否有一種簡單的方法可以根據更改表中添加的新列來處理在目標表中創建新列?

基於這個問題,並且您聲明您已經有一個將數據複製到另一台伺服器的腳本這一事實,您似乎正在嘗試以多種方式擷取更改。您可能想要探索的一種方法是System-Versioned Temporal Tables。這對您來說可能是最簡單的路線,並且可以消除 CDC 和您的 SSIS / 自定義腳本,尤其是因為您的 DML 事件似乎很低。當您對源表進行 DDL 更改時,這些表也會發生變化。

如果一個更改表中有 100 萬行而不是 20K 行,答案是否會改變?

因為這將是行數的 50 倍,所以當然,您可以預期針對這些更改表的任何查詢的性能會產生不同的結果。

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