変更データ キャプチャ プロセスの監視
変更データ キャプチャ プロセスを監視すると、変更が変更テーブルに適切に書き込まれているかどうか、および書き込み時の待機時間が妥当かどうかを判断できます。また、発生する可能性のあるエラーを特定することもできます。SQL Server には、変更データ キャプチャの監視に役立つ 2 つの動的管理ビューが用意されています。
-
sys.dm_cdc_log_scan_sessions 管理ビューには、現在のデータベース内のログ スキャン セッションごとに 1 つの行が格納されます。最後の行は、現在のセッションを表します。このビューには、セッション ID が 0 の行も格納されています。この行には、SQL Server のインスタンスが最後に起動してからのすべてのセッションに関する集計情報が含まれています。
-
sys.dm_cdc_errors 管理ビューには、変更データ キャプチャのログ スキャン セッション中に発生したエラーごとに 1 つの行が格納されます。
空の結果セットを含むセッションの特定
sys.dm_cdc_log_scan_sessions の各行はログ スキャン セッションを表します (ID が 0 の行を除く)。ログ スキャン セッションは、sp_cdc_scan の 1 回の実行に相当します。セッション中、スキャンによって変更内容または空の結果のいずれかが返されます。結果セットが空の場合、sys.dm_cdc_log_scan_sessions の empty_scan_count 列が 1 に設定されます。空の結果セットが連続する場合 (キャプチャ ジョブを連続的に実行している場合など)、既存の最後の行の empty_scan_count が増分されます。たとえば、変更内容を返したスキャンについて、sys.dm_cdc_log_scan_sessions に既に 10 行が格納されており、5 つの空の結果が行に含まれている場合、ビューには 11 行が格納され、最後の行の empty_scan_count 列の値は 5 になります。空のスキャンを含むセッションを確認するには、次のクエリを実行します。
SELECT * from sys.dm_cdc_log_scan_sessions where empty_scan_count <> 0
待機時間の判断
sys.dm_cdc_log_scan_sessions 管理ビューには、各キャプチャ セッションの待機時間を記録する列があります。待機時間は、トランザクションがソース テーブルにコミットされてから、最後にキャプチャされたトランザクションが変更テーブルにコミットされるまでの経過時間として定義されます。待機時間列では、アクティブなセッションについてのみ値が設定されます。empty_scan_count 列の値が 0 より大きいセッションについては、待機時間列は 0 に設定されます。次のクエリは、最新のセッションの平均待機時間を返します。
SELECT latency FROM sys.dm_cdc_log_scan_sessions WHERE session_id = 0
待機時間データを使用すると、キャプチャ プロセスでのトランザクションの処理時間を確認できます。このデータが最も役立つのは、キャプチャ プロセスを連続的に実行している場合です。スケジュールに従ってキャプチャ プロセスを実行している場合、トランザクションがソース テーブルにコミットされてから、スケジュールされた時間にキャプチャ プロセスが実行されるまでの間に遅延が生じるため、待機時間が長くなる可能性があります。
キャプチャ プロセスに関するもう 1 つの重要な指標はスループットです。これは、各セッション中に処理された 1 秒あたりの平均コマンド数です。セッションのスループットを確認するには、command_count 列の値を実行時間列の値で除算します。次のクエリは、最新のセッションの平均スループットを返します。
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 テーブルを検索します。このテーブルには、ログ スキャン セッションのデータの履歴スナップショットが格納されています。このデータを使用すると、待機時間やスループットなどのパフォーマンス指標を時系列で分析できます。