Предостережение : большая часть информации, представленной ниже, я узнал строго, пройдя два курса 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)