SQL Server Genişletilmiş Olaylar verilerini görselleştirme


16

Son zamanlarda, çeşitli sorguları karşılaştırmamı ve optimize etmemi sağlamak için SQL Server'da Genişletilmiş Etkinlikler'i kullanıyorum. Şimdiye kadar, SSMS'deki "Canlı Verileri İzle" özelliğini kullandığım olay verilerini görüntülemek için.

Yaşadığım sorun, Canlı Etkinlikler özelliğinin dahili bir arabellek kullandığına işaret etmesidir, bu da bazen pencerede görüntülenecek bilgileri almak için birkaç kez bir sorgu yürütmek zorunda olduğum anlamına gelir. Bu nedenle iki bölümden oluşan bir sorum olacak:

  1. Etkinliklerin 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)
  2. Canlı yayın Genişletilmiş Etkinlikler verilerini görselleştirmenin en iyi yolu mu? SSMS'de başka bir araç var mı yoksa kullanım durumuma daha iyi uyarlanmış mı?

GÜNCELLEME

İstendiği gibi, oturum şu şekildedir:

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

Yanıtlar:


15

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 synchronousya asynchronousveri 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_LATENCYKontroller 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_LATENCYyapı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 AdventureWorks2012yerel örneğimdeki veritabanı verilerini yakalamak için filtrelemem dışında, bu oturumun hedef verilerini görüntüleyebilir ve sorgunun yakalandığını bulabilirim:

resim açıklamasını buraya girin resim açıklamasını buraya girin

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 STOPoturum ve arabellek tamamen gönderilir. Oturumumu durdurduğumda bunu görüyorum:

resim açıklamasını buraya girin

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_MEMORYOlayları 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_bufferhedef 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)

resim açıklamasını buraya girin


3
Harika cevap, çok ayrıntılı. Sadece bir nokta, ve bu gerçek bir tartışmadan daha çok ilgi çekici; Johnathan Kehayias'tan bahsettiniz ve katılıyorum, Çoğul görme kursları 1 aylık ücrete% 100 değer. Bununla birlikte, Ring Buffer hedefinden nasıl nefret ettiğini konuştuğu bir blogu var . 2014'ten beri, belki de şimdi değişti ama ilginç bir okuma oldu: sqlskills.com/blogs/jonathan/…
Kalmino

1

Net 4.7.2, canlı hedefi kullanırken olay görüntüleme için başlangıç ​​gecikmesini azaltmak için bir düzeltmeye sahiptir.


2
Cevabınızı desteklemek için bir referans verebilir misiniz? Şu anda cevabınız pek bir şey içermiyor.
John aka hot2use
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.