Dikkat : Aşağıda verilen bilgilerin çoğu Jonathan Keyhayias tarafından yapılan iki Çoğulluk kursuna katılarak öğrendim . Artı aboneliği iki dersleri geçmek için bir aylık masraf değer.
Öncelikle yardımcı olacağını düşündüğüm birkaç ilgi çekici nokta (veya en fazla ilgi çekici olacaktır):
- Bir Genişletilmiş Olay oturumu başlatıldığında, oturumun olayları tarafından oluşturulan verileri depolamak için belleğin bir arabellek alanına ayrılmış olur. Oturumunuzda bu varsayılan değer olan 4 MB olarak ayarlanmıştır
- Kullanılabilecek birden fazla hedef var. Bu hedefler ya
synchronous
ya asynchronous
veri nasıl alınır. Hedef Dosya ve Halka Tamponu olmak üzere en sık kullanılan iki hedefin ikisi de eşzamansızdır. Buradaki BOL makalesi, her hedefin ne tür olduğunu belirtir .
MAX_DISPATCH_LATENCY
Kontroller olay veri hedef (ler) sevk olduğu bir yapılandırma seçeneğidir. Dağıtım yalnızca eşzamansız hedefler için gerçekleşir. Olay verilerinin gönderilmesine neden olacak iki durum vardır: (1) oturum için bellek arabelleği dolu veya (2) arabelleğe alınan olay verileri oturumun MAX_DISPATCH_LATENCY
yapılandırılmış seçeneğini aşıyor .
- Canlı Veri Görüntüleyicisi'ni açtığınızda, etkinlik oturumuna "akış hedefi" adı verilen ek bir hedef eklenir. Bu, bellek arabellekleri gönderilirken canlı olay akışını alır. Ayrıca, oturumun gerçek zamanlıya yakın görünümünü elde etmek için oturumla ilişkili gönderme gecikmesini 3 saniyeye değiştirecektir.
Şimdi sorunuzdaki belirli noktalara:
Yaşadığım sorun, Live Events özelliğinin dahili bir arabellek kullanması gibi görünüyor, bu da bazen pencerede görüntülenmesi için bilgilerini almak için birkaç kez bir sorgu yürütmesi gerektiği anlamına geliyor. Bu yüzden sormak için iki bölümlü bir sorum var
Bunu yukarıda belirttiğimden farklı olarak yaptığının farkında değilim. Etkinliğin yakalandığını, yalnızca canlı veri görüntüleyicinize gönderilmesi için gereken eşikleri karşılamadığını umuyorum. Aşağıdaki sorgu ile bu test AdventureWorks2012
:
SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO
Olay oturumu yapılandırmanızı kullanarak, yalnızca AdventureWorks2012
yerel örneğimdeki veritabanı verilerini yakalamak için filtrelemem dışında, bu oturumun hedef verilerini görüntüleyebilir ve sorgunun yakalandığını bulabilirim:
Bu sorguyu bir kez daha yürütmek nihayet gönderilmesine neden olur ve veri görüntüleyici bir olay görüntüler. Şimdi gerçekten görüntülenen tüm olayları görmek istiyorsanız sadece STOP
oturum ve arabellek tamamen gönderilir. Oturumumu durdurduğumda bunu görüyorum:
Canlıların canlı yayında gösterilmesini sağlamada bu gecikmeyi aşmanın bir yolu var mı? (Bunu yerel bir veritabanında yapıyorum, bu yüzden performans bir sorun değil)
MAX_MEMORY
Olayları yakalamak için küçük bir arabellek boyutunu gösteren daha düşük bir değere değiştirebileceğinizi düşünmüştüm . Ancak bunu SQL Server 2012'de ayarlayabileceğiniz en düşük değer 200KB
, kullandığım sorgunun hemen gönderilmesine neden olan bu sınırı karşılamadığı değerdir . Yapabileceğim tek şey en fazla arabellek ulaşılmasını ve yakalanan önceki olayların gönderilmesini neden olacak bir sorgu yürütmek oldu:
SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;
Canlı yayın Genişletilmiş Etkinlikler verilerini görselleştirmenin en iyi yolu mudur? SSMS'de başka bir araç var mı yoksa kullanım durumuma daha iyi uyarlanmış mı?
Şu anda farkında olduğumdan değil. En kısa sürede veri almak için en iyi yöntem öneriyoruz XML için ring_buffer
hedef sorgulamak ve sadece dışarı parçalamak olduğunu. Yukarıdaki örneği tekrarlayabilir ve aşağıdaki sorguyu yürütür yürütmez olayı görüyorum.
-- 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)