監視異動資料擷取程序
監視異動資料擷取程序可讓您判斷變更是否正確地並且以合理的延遲寫入變更資料表。此外,監視也可以協助您識別可能發生的任何錯誤。SQL Server 含有兩個動態管理檢視,可協助您監視異動資料擷取:
-
sys.dm_cdc_log_scan_sessions 管理檢視會針對目前資料庫中的每個記錄檔掃描工作階段,各包含一個資料列。最後一個資料列代表目前的工作階段。此檢視也包含工作階段識別碼為 0 的資料列,其中包含自從上次啟動 SQL Server 執行個體以來所有工作階段的相關彙總資訊。
-
sys.dm_cdc_errors 管理檢視會針對在異動資料擷取記錄檔掃描工作階段期間遇到的每個錯誤,各包含一個資料列。
識別含有空白結果集的工作階段
sys.dm_cdc_log_scan_sessions 中的每個資料列都代表記錄檔掃描工作階段 (除了識別碼為 0 的資料列以外)。記錄檔掃描工作階段相當於執行一次 sp_cdc_scan。在工作階段期間,掃描可能會傳回變更或傳回空的結果。如果結果集是空的,sys.dm_cdc_log_scan_sessions 中的 empty_scan_count 資料行就會設定為 1。如果含有連續的空結果集 (例如擷取作業連續執行),最後一個現有資料列中的 empty_scan_count 就會遞增。例如,如果 sys.dm_cdc_log_scan_sessions 已經針對傳回變更的掃描包含 10 個資料列,而且資料列中含有五個空的結果,表示檢視包含 11 個資料列。在 empty_scan_count 資料行中,最後一個資料列的值為 5。若要判斷具有空白掃描的工作階段,請執行下列查詢:
SELECT * from sys.dm_cdc_log_scan_sessions where empty_scan_count <> 0
判斷延遲
sys.dm_cdc_log_scan_sessions 管理檢視含有記錄每個擷取工作階段之延遲的資料行。延遲會定義成在來源資料表上認可交易與在變更資料表上認可最後一個擷取交易之間經過的時間。系統只會針對使用中工作階段填入 latency 資料行。若為 empty_scan_count 資料行中的值大於 0 的工作階段,latency 資料行就會設定為 0。下列查詢會針對最近的工作階段傳回平均延遲:
SELECT latency FROM sys.dm_cdc_log_scan_sessions WHERE session_id = 0
您可以使用延遲資料來判斷擷取程序處理交易的速度快慢。當擷取程序連續執行時,這項資料便最有用。如果擷取程序正按照排程執行,延遲可能會很高,因為在來源資料表上認可交易與按照排程時間執行的擷取程序之間存在延遲。
擷取程序效率的另一個重要量值是輸送量。這是指每個工作階段期間每秒處理的平均命令數目。若要判斷某個工作階段的輸送量,請將 command_count 資料行中的值除以 duration 資料行中的值。下列查詢會針對最近的工作階段傳回平均輸送量:
SELECT command_count/duration AS [Throughput] FROM sys.dm_cdc_log_scan_sessions WHERE session_id = 0
使用資料收集器來收集取樣資料
SQL Server 資料收集器可讓您從任何資料表或動態管理檢視中收集資料的快照集,然後建立效能資料倉儲。當資料庫啟用異動資料擷取時,以固定間隔建立 sys.dm_cdc_log_scan_sessions 檢視和 sys.dm_cdc_errors 檢視的快照集以便之後分析會很有用。下列程序會設定從 sys.dm_cdc_log_scan_sessions 管理檢視中收集取樣資料的資料收集器。
設定資料收集
啟用資料收集器並設定管理資料倉儲。如需詳細資訊,請參閱<使用 SQL Server Management Studio 管理資料收集>。
執行下列程式碼來建立異動資料擷取的自訂收集器。
USE msdb; DECLARE @schedule_uid uniqueidentifier; -- Collect and upload data every 5 minutes SELECT @schedule_uid = ( SELECT schedule_uid from sysschedules_localserver_view WHERE name = N'CollectorSchedule_Every_5min') DECLARE @collection_set_id int; EXEC dbo.sp_syscollector_create_collection_set @name = N' CDC Performance Data Collector', @schedule_uid = @schedule_uid, @collection_mode = 0, @days_until_expiration = 30, @description = N'This collection set collects CDC metadata', @collection_set_id = @collection_set_id output; -- Create a collection item using statistics from -- the change data capture dynamic management view. DECLARE @paramters xml; DECLARE @collection_item_id int; SELECT @paramters = CONVERT(xml, N'<TSQLQueryCollector> <Query> <Value>SELECT * FROM sys.dm_cdc_log_scan_sessions</Value> <OutputTable>cdc_log_scan_data</OutputTable> </Query> </TSQLQueryCollector>'); EXEC dbo.sp_syscollector_create_collection_item @collection_set_id = @collection_set_id, @collector_type_uid = N'302E93D1-3424-4BE7-AA8E-84813ECF2419', @name = ' CDC Performance Data Collector', @frequency = 5, @parameters = @paramters, @collection_item_id = @collection_item_id output; GO
在 SQL Server Management Studio 中,展開 [管理],然後展開 [資料收集]。以滑鼠右鍵按一下 [CDC 效能資料收集器],然後按一下 [啟動資料收集組]。
在步驟 1 中設定的資料倉儲內,找出資料表 custom_snapshots.cdc_log_scan_data。這份資料表會提供記錄檔掃描工作階段之資料的歷程記錄快照集。這份資料表可用於分析經過一段時間的延遲、輸送量和其他效能量值。