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)