Визуализация данных расширенных событий SQL Server

16

В последнее время я изучал использование расширенных событий в SQL Server, чтобы помочь мне оценить и оптимизировать различные запросы. До сих пор для просмотра данных о событиях я использовал функцию «Смотреть данные в реальном времени» в SSMS.

Проблема, с которой я столкнулся, заключается в том, что, похоже, функция Live Events использует внутренний буфер, а это означает, что иногда мне нужно выполнить запрос несколько раз, чтобы информация отображалась в окне. Поэтому у меня есть вопрос из двух частей:

  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
Леви Ботельо
источник

Ответы:

15

Предостережение : большая часть информации, представленной ниже, я узнал строго, пройдя два курса Pluralsight Джонатана Кейхайяса . Стоит потратить один месяц, чтобы подписка «плюс» прошла через два его курса.

Сначала просто несколько интересных моментов, которые, я думаю, помогут (или, самое большее, будут интересны):

  • Когда начинается сеанс расширенного события, у него будет часть памяти, выделенная под буферное пространство для хранения данных, сгенерированных событиями сеанса. В вашей сессии это значение по умолчанию 4 МБ
  • Есть несколько целей, доступных для использования. Эти цели либо в том, synchronousили asynchronousкак они получают данные. Две наиболее часто используемые цели - Target File и Ring Buffer - являются асинхронными. В статье BOL указывается тип каждой цели .
  • Параметр MAX_DISPATCH_LATENCYконфигурации, который управляет отправкой данных о событии в цель (и). Диспетчеризация происходит только для асинхронных целей. Существуют два условия, из-за которых отправляются данные события: (1) буфер памяти для сеанса переполнен или (2) данные события в буфере превышают MAX_DISPATCH_LATENCYнастроенный параметр сеанса .
  • Когда вы открываете Live Data Viewer, он присоединяет дополнительную цель к сеансу событий, которая называется «цель потоковой передачи». Это получит живой поток событий, поскольку буферы памяти отправляются. Это фактически также изменит задержку диспетчеризации, связанную с сеансом, на 3 секунды, чтобы приблизиться к представлению сеанса в режиме реального времени.

Теперь к конкретным моментам в вашем вопросе:

Проблема, с которой я столкнулся, заключается в том, что, похоже, функция Live Events использует внутренний буфер, а это означает, что иногда мне нужно выполнить запрос несколько раз, чтобы информация отображалась в окне. Поэтому у меня есть вопрос, состоящий из двух частей

Я не знаю, что он делает это иначе, чем я сказал выше. Я ожидаю, что событие было зафиксировано, но оно не соответствует пороговым значениям, необходимым для его отправки в вашу программу просмотра данных в реальном времени. Я проверил это с помощью следующего запроса 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 или нет, который лучше подходит для моего случая использования?

Не то, чтобы я знал в настоящее время. Я хотел бы предложить лучший способ получения данных, как только это произойдет, это запросить XML для ring_bufferцели и просто уничтожить это. Я могу повторить приведенный выше пример, и как только я выполню приведенный ниже запрос, я увижу событие.

-- 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)

введите описание изображения здесь


источник
3
Отличный ответ, очень подробный. Только точка, и это больше интерес, чем любая реальная дискуссия; Вы упомянули Джонатана Кеяйаса, и, я согласен, его курсы Pluralsight оплачиваются на 100% за 1 месяц. Тем не менее, у него есть блог, где он рассказывает о том, как он ненавидит цель Кольцевого буфера. Это было в 2014 году, так что, может быть, это изменилось сейчас, но это было интересное чтение: sqlskills.com/blogs/jonathan/…
Kalmino
1

В .Net 4.7.2 исправлено уменьшение начальной задержки отображения событий при использовании живой цели.

Дэвид Шифлет
источник
2
Не могли бы вы предоставить ссылку в поддержку вашего ответа? В настоящее время ваш ответ не содержит много, чтобы пойти с.
Джон aka hot2use