SQL Server 확장 이벤트 데이터 시각화 Live Data”기능을 사용하고 있습니다. 내가 가진 문제는

최근에 SQL Server에서 확장 이벤트를 사용하여 다양한 쿼리를 벤치마킹하고 최적화하는 방법을 모색했습니다. 지금까지 이벤트 데이터를 보려면 SSMS에서 “Watch Live Data”기능을 사용하고 있습니다.

내가 가진 문제는 라이브 이벤트 기능이 내부 버퍼를 사용하는 것처럼 보이며, 때로는 정보를 창에 표시하기 위해 쿼리를 여러 번 실행해야한다는 것을 의미합니다. 따라서 두 가지 질문이 있습니다.

  1. 실시간 피드에 이벤트가 표시 될 때이 지연을 피할 수있는 방법이 있습니까? (로컬 데이터베이스 에서이 작업을 수행하므로 성능에 문제가 없습니다)
  2. 실시간 피드가 확장 이벤트 데이터를 시각화하는 가장 좋은 방법입니까? SSMS에 사용 도구에 더 적합한 다른 도구가 있습니까?

최신 정보

요청한대로 세션은 다음과 같습니다.

CREATE EVENT SESSION [Simple Query Benchmarking] ON SERVER
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
    ACTION(sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.sql_text)
    WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_uint64]([duration],(1000))))
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO


답변

주의 사항 : 아래 제공된 많은 정보는 다음 두 가지 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)


답변

.Net 4.7.2에는 라이브 대상을 사용할 때 이벤트 표시의 초기 지연을 줄 이도록 수정되었습니다.