Візуалізація даних про розширені події 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

Caveat : Багато інформації, наданої нижче, я суворо довідався, пройшовши два курси з питань плюралізму Джонатана Кейхаяса . Добре коштує витрата в місяць на плюс абонемент, щоб пройти два його курси.

Спочатку кілька цікавих місць, які, на мою думку, допоможуть (або максимум зацікавлять):

  • Коли запускається розширений сеанс подій, у нього буде частина пам'яті, виділена в буферний простір, для зберігання даних, генерованих подіями сеансу. У вашому сеансі це значення встановлено за замовчуванням у 4 Мб
  • Існує кілька цілей, доступних для використання. Ці цілі є synchronousабо asynchronousв тому, як вони отримують дані. Дві найчастіше використовувані цілі - це цільовий файл та буфер кільця, є асинхронними. Стаття BOL тут вказує, який тип має кожна ціль .
  • Це MAX_DISPATCH_LATENCYпараметр конфігурації, який керує, коли дані події надсилаються до цілі. Диспетчеризація відбувається лише для асинхронних цілей. Існують дві умови, які можуть призвести до розсилки даних про події: (1) буфер пам'яті для сеансу заповнений або (2) дані події в буфері перевищують параметр MAX_DISPATCH_LATENCYналаштованого сеансу .
  • Коли ви відкриєте переглядач даних в реальному часі, він додасть додаткову ціль до сеансу події під назвою "потокова ціль". Це отримає потік події в реальному часі під час відправлення буферів пам'яті. Це фактично також змінить затримку відправки, пов’язану з сеансом, на 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
Чудова відповідь, дуже детальна. Тільки точка, і це більше цікавить, ніж будь-яка реальна дискусія; Ви згадали про Джонатана Кехайя і, я згоден, його курси з питань плюралізму на 100% коштують плату за 1 місяць. Однак у нього є блог, де він розповідає про те, як ненавидить ціль кільцевого буфера. Це було з 2014 року, тому, можливо, це змінилося зараз, але цікаво було прочитати: sqlskills.com/blogs/jonathan/…
Kalmino

1

.Net 4.7.2 має виправлення, щоб зменшити початкову затримку для відображення події при використанні живої цілі.


2
Чи можете ви надати посилання на підтвердження вашої відповіді? На даний момент ваша відповідь не містить багато, що потрібно зробити.
Джон ака hot2use
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.