經常會有需求記錄用戶表中由DML操作(Insert/Updae/Delete)引起的數據變化,在SQL Server 2008 以前的版本中,要實現這樣的功能只能通過Trigger或者數據比對(例如SCD處理),而且必須針對每個用戶表開發。SQL Server 2008中新增了兩種記錄數據變化的功能,本文就Change Data Capture(CDC)和Change Tracking的特性做簡要對比。
網站設計、成都做網站服務團隊是一支充滿著熱情的團隊,執著、敏銳、追求更好,是創新互聯的標準與要求,同時竭誠為客戶提供服務是我們的理念。成都創新互聯把每個網站當做一個產品來開發,精雕細琢,追求一名工匠心中的細致,我們更用心!
Change Data Capture
CDC通過對事務日志的異步讀取,記錄DML操作的發生時間、類型和實際影響的數據變化,然后將這些數據記錄到啟用CDC時自動創建的表中。通過cdc相關的存儲過程,可以獲取詳細的數據變化情況。由于數據變化是異步讀取的,因此對整體性能的影響不大,遠小于通過Trigger實現的數據變化記錄。
下圖來自于SQL Server Books Online,說明了CDC可用于獲取不同時間段內的變化。
Change Tracking
不同于Change Data Capture,Change Tracking僅記錄DML操作的發生時間、類型和影響到的字段,不包含具體的變化數值,客戶端通過傳傳遞上次同步的版本號來獲取從上次同步到現在的變化記錄。對于應用數據緩存的場合,這個功能非常實用,可以每隔一定時間獲取數據表中的變化記錄,然后根據變化記錄中的主鍵來獲取更新過的數據從而刷新緩存。
Change Tracking通過對要執行的DML語句的分析獲取變化記錄,而不是去讀取日志。DML語句提交執行時Change Tracking便已可用,而不需要等待DML完成后事務日志寫入時才可用,因此Change Tracking的響應比Change Data Capture要快。
Change Tracking記錄的數據比Change Data Capture少,對服務器性能的影響也小。
創建表,存儲每天的表空間占用情況
CREATE TABLE [dbo].[t_rpt_table_spaceinfo](
[table_name] [sysname] NOT NULL,
[record_date] [date] NOT NULL,
[record_time] [time](7) NOT NULL,
[rows_count] [bigint] NULL,
[reserved] [bigint] NULL,
[data_size] [bigint] NULL,
[index_size] [bigint] NULL,
[unused] [bigint] NULL,
CONSTRAINT [PK_t_rpt_table_spaceinfo] PRIMARY KEY CLUSTERED
(
[table_name] ASC,
[record_date] ASC,
[record_time] ASC
)
)
2. 新建作業
新建作業,作業計劃每天凌晨運行一次,每天記錄表占用的空間情況,存儲到上一步建立的表中
作業中執行的T-SQL代碼為:
SET NOCOUNT ON
/*創建臨時表,存放用戶表的空間及數據行數信息*/
CREATE TABLE #tablespaceinfo
(
nameinfo VARCHAR(500) ,
rowsinfo BIGINT ,
reserved VARCHAR(20) ,
datainfo VARCHAR(20) ,
index_size VARCHAR(20) ,
unused VARCHAR(20)
)
DECLARE @tablename VARCHAR(255);
/*使用游標,循環得到表空間使用情況*/
DECLARE Info_cursor CURSOR
支持,sqlserver能加上去就完美了
可以查詢系統表 select * from sysobjects進行監控, 看crdate大于某個時間點是否有數據。 監控可以定時掃描的方式。