介紹
更改跟蹤是一種輕量型解決方案,它為應用程序提供了一種有效的更改跟蹤機制。常規的,自定義變更跟蹤和讀取跟蹤數據,會使用觸發器,存儲過程和記錄變更的用戶表等,
還需要保證訪問一致和相關清理工作。 使用CT會減少額外工作量和保證訪問一致性。
啟用CT的表上必須得有主鍵,所有版本適用。為了保證更改信息的有效性,官方建議結合快照隔離使用。
CT只能提供:
哪些行/列發生了更改
被更改行的最新數據。
不能提供:更改發生的次數,中間值。
應用:離線緩存的更新,ETL更新
注意事項:
1. 寫入變更到變更記錄表,所以執行計划會多一個操作符,增加開銷。
2. 每個啟用CT的表會創建一個內部更改表。
3. 對於用戶表中每行的每個更改,都會向內部更改表中添加一行。 該行有一個較小的固定開銷,外加一個大小等於主鍵列大小的可變開銷。
4. 對於每個已提交的事務,都會向內部事務表中添加一行。
實現
1. 在庫級別啟用CT
alter database TestCT set change_tracking=on ( change_retention=2 days, auto_cleanup=on )
2. 對要跟蹤的對象啟用CT
3. 使用 CHANGETABLE 函數查看CT數據。SYS_CHANGE_VERSION是 庫中任何行的變改的最新版本號。alter table sometable enable change_tracking go
返回行的最新更改數據:
返回指定last_sync_versiion 后改變的數據:SELECT t.* , ct.* FROM dbo.SomeTable t CROSS APPLY CHANGETABLE(VERSION dbo.SomeTable, (ID), (t. ID)) AS ct;
DECLARE @version BIGINT = 2; SELECT t.* , ct.* FROM CHANGETABLE (CHANGES dbo.SomeTable, @version) AS ct INNER JOIN dbo.SomeTable t ON t. ID = ct. ID Go
4. 對列啟用CT
5. 查詢CT列的變更數據CREATE TABLE dbo.NewTable ( ID INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_NewTable PRIMARY KEY , BigColumn VARCHAR(255) NOT NULL , AnotherBigColumn VARCHAR(255) NOT NULL ) GO ALTER TABLE NewTable ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED=ON)
使用CHANGE_TRACKING_IS_COLUMN_IN_MASK結合CHANGETABLE
DECLARE @version BIGINT ; --get previous version SELECT @version= CHANGE_TRACKING_CURRENT_VERSION()-1; SELECT *, CHANGE_TRACKING_IS_COLUMN_IN_MASK( COLUMNPROPERTY( OBJECT_ID('dbo.NewTable'),'BigColumn','COLUMNID' ), CT.SYS_CHANGE_COLUMNS ) AS BigColumn_Changed, CHANGE_TRACKING_IS_COLUMN_IN_MASK( COLUMNPROPERTY( OBJECT_ID('dbo.NewTable'), 'AnotherBigColumn','COLUMNID' ), CT.SYS_CHANGE_COLUMNS ) AS AnotherBigColumn_Changed FROM CHANGETABLE(CHANGES dbo.NewTable,@version) AS CT INNER JOIN dbo.NewTable NT ON CT.ID=NT.ID
總結
1. 所謂輕量,是相對的。CT仍需要記錄變更記錄,需要額外的開銷。
2. CT只能記錄最終值,所以實際應用中用得不多,只適用於特定場景。
