주의 사항 : 아래 제공된 많은 정보는 다음 두 가지 Pluralsight 코스를 통해 엄격히 배웠습니다. Jonathan Keyhayias의 . 플러스 구독이 두 코스를 거치는 데 한 달의 비용이 들었습니다.
먼저 내가 도울 것이라고 생각하는 몇 가지 관심 지점 (또는 최대 관심 대상) :
- 확장 이벤트 세션이 시작되면 세션 이벤트에 의해 생성 된 데이터를 저장하기 위해 버퍼 공간에 할당 된 메모리 부분이 있습니다. 세션에서 이것은 기본값 4MB로 설정됩니다
- 사용 가능한 여러 대상이 있습니다. 이 목표는 하나
synchronous
또는asynchronous
데이터를받는 방법 방법에 있습니다. 대상 파일과 링 버퍼 인 가장 일반적으로 사용되는 두 대상은 모두 비동기입니다. 여기서 BOL 기사는 각 대상의 유형을 나타냅니다 .
- 그만큼
MAX_DISPATCH_LATENCY
컨트롤 이벤트 데이터는 타겟 (들)에 전달되도록 구성 옵션이다. 디스패치는 비동기 대상에 대해서만 발생합니다. 이벤트 데이터를 전달하는 두 가지 조건이 있습니다. (1) 세션의 메모리 버퍼가 가득 찼거나 (2) 버퍼의 이벤트 데이터가 세션의 MAX_DISPATCH_LATENCY
구성된 옵션을 초과합니다 .
- 라이브 데이터 뷰어를 열면 "스트리밍 대상"이라는 이벤트 세션에 추가 대상이 연결됩니다. 메모리 버퍼가 디스패치 될 때 라이브 이벤트 스트림을 수신합니다. 실제로 세션을 거의 실시간으로 볼 수 있도록 세션과 관련된 디스패치 대기 시간을 3 초로 변경합니다.
이제 질문의 특정 지점으로 :
내가 가진 문제는 라이브 이벤트 기능이 내부 버퍼를 사용하는 것처럼 보이며, 때로는 정보를 창에 표시하기 위해 쿼리를 여러 번 실행해야한다는 것을 의미합니다. 따라서 두 가지 질문이 있습니다.
나는 위에서 언급 한 것 이외의 다른 일을하고 있다는 것을 알지 못합니다. 이벤트가 캡처되어 라이브 데이터 뷰어로 디스패치하는 데 필요한 임계 값을 충족하지 못했을 것으로 예상됩니다. 나는 이것을 다음과 같은 쿼리로 테스트했다 AdventureWorks2012
.
SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO
AdventureWorks2012
로컬 인스턴스에서 데이터베이스의 데이터 만 캡처하도록 필터링하는 것을 제외하고 이벤트 세션 구성을 사용하면 이 세션의 대상 데이터를보고 쿼리가 캡처 된 것을 찾을 수 있습니다.
이 쿼리를 한 번 더 실행하면 마침내 쿼리가 전달되고 데이터 뷰어에 하나의 이벤트가 표시됩니다. 이제 실제로 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)