警告:以下に提供される情報の多くは、ジョナサン・ケイヘイアスによる2つのPluralsightコースを厳密に学習したことから学んだものです。プラスサブスクリプションの1か月分の費用は、彼の2つのコースを受講する価値があります。
まず、役立つと思われるいくつかの興味のあるポイント(またはせいぜい興味がある):
- 拡張イベントセッションが開始されると、セッションのイベントによって生成されたデータを保存するために、メモリの一部がバッファスペースに割り当てられます。セッションでは、これはデフォルト値の4MBに設定されます
- 使用可能な複数のターゲットがあります。これらのターゲットは、データを受信する方法
synchronous
またはasynchronous
その方法です。ターゲットファイルとリングバッファである2つの最も一般的に使用されるターゲットは両方とも非同期です。ここのBOLの記事は、各ターゲットのタイプを示しています。
MAX_DISPATCH_LATENCY
コントロールは、イベント・データをターゲット(複数可)にディスパッチされた構成オプションです。ディスパッチは非同期ターゲットに対してのみ発生します。イベントデータがディスパッチされる原因となる2つの条件があります。(1)セッションのメモリバッファーがいっぱいであるか、(2)バッファー内のイベントデータがセッションのMAX_DISPATCH_LATENCY
構成済みオプションを超えています。
- ライブデータビューアーを開くと、「ストリーミングターゲット」と呼ばれる追加のターゲットがイベントセッションに追加されます。これは、メモリバッファがディスパッチされるときにライブイベントストリームを受け取ります。また、セッションのリアルタイムに近いビューを取得するために、セッションに関連付けられたディスパッチ遅延を実際に3秒に変更します。
質問の特定のポイントへ:
私が抱えている問題は、ライブイベント機能が内部バッファーを使用しているように見えることです。つまり、クエリを数回実行して、情報をウィンドウに表示する必要がある場合があります。したがって、2つの部分からなる質問があります
上記のこと以外にこれを行うことを認識していません。イベントがキャプチャされ、ライブデータビューアーにディスパッチするために必要なしきい値を満たしていないことが予想されます。次のクエリでテストしましたAdventureWorks2012
:
SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO
AdventureWorks2012
ローカルインスタンス上のデータベースのデータのみをキャプチャするためにフィルタリングしていることを除いて、イベントセッション構成を使用して、このセッションのターゲットデータを表示し、クエリがキャプチャされたことを見つけることができます。
このクエリをもう一度実行すると、最終的にクエリがディスパッチされ、データビューアに1つのイベントが表示されます。表示されているすべてのイベントを実際に表示したい場合は、単にSTOP
セッションとバッファーが完全にディスパッチされます。セッションを停止すると、これが表示されます。
1.ライブフィードにイベントを表示する際にこの遅延を回避する方法はありますか?(私はローカルデータベースでこれを行っているので、パフォーマンスは問題になりません)
MAX_MEMORY
イベントをキャプチャするための小さなバッファサイズを示すより低い値に変更できると思っていました。ただし、SQL Server 2012でこれに設定できる最小値は200KB
であり、使用したクエリはその制限を満たしていないため、すぐにディスパッチされます。私ができることは、せいぜいバッファに到達し、キャプチャされた以前のイベントをディスパッチするクエリを実行することだけでした。
SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;
2.ライブフィードは、拡張イベントデータを視覚化する最良の方法ですか?SSMSには、ユースケースに適した別のツールがありますか?
私が現在知っていることではありません。データが発生したらすぐにデータを取得する最善の方法は、ring_buffer
ターゲットのXMLをクエリし、それを完全に削除することです。上記の例を繰り返して、下のクエリを実行するとすぐにイベントが表示されます。
-- Create XML variable to hold Target Data
DECLARE @target_data XML
SELECT @target_data = CAST([t].[target_data] AS XML)
FROM [sys].[dm_xe_sessions] AS s
JOIN [sys].[dm_xe_session_targets] AS t
ON [t].[event_session_address] = [s].[address]
WHERE [s].[name] = N'Simple Query Benchmarking' AND
[t].[target_name] = N'ring_buffer' ;
-- Return the full XML document
--SELECT @target_data;
--Shred XMl to get needed data
SELECT DATEADD(hh, DATEDIFF(hh, GETUTCDATE(), CURRENT_TIMESTAMP), n.value('(@timestamp)[1]', 'datetime2')) AS [timestamp],
n.value('(data[@name="duration"]/value)[1]', 'bigint') as duration,
n.value('(action[@name="sql_text"]/value)[1]', 'varchar(max)') as sql_text
FROM @target_data.nodes('RingBufferTarget/event[@name=''sql_batch_completed'']') AS q(n)