Memvisualisasikan data SQL Server Extended Events

16

Akhir-akhir ini saya telah menjelajahi menggunakan Acara yang Diperpanjang dalam SQL Server untuk membantu saya membuat tolok ukur dan mengoptimalkan berbagai pertanyaan. Sejauh ini, untuk melihat data acara saya telah menggunakan fitur "Tonton Data Langsung" di SSMS.

Masalah yang saya alami adalah tampaknya fitur Acara Langsung menggunakan buffer internal, yang berarti bahwa kadang-kadang saya perlu menjalankan kueri beberapa kali untuk mendapatkan informasi untuk ditampilkan di jendela. Karena itu saya punya pertanyaan dua bagian untuk ditanyakan:

  1. Apakah ada cara untuk mengatasi keterlambatan ini agar acara ditampilkan di live feed? (Saya melakukan ini pada database lokal sehingga kinerja tidak menjadi masalah)
  2. Apakah umpan langsung adalah cara terbaik untuk memvisualisasikan data Peristiwa Diperpanjang? Apakah ada alat lain di SSMS atau tidak yang lebih baik disesuaikan dengan kasus penggunaan saya?

MEMPERBARUI

Seperti yang diminta, inilah sesi:

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
Levi Botelho
sumber

Jawaban:

15

Peringatan : Banyak informasi yang disediakan di bawah ini yang saya pelajari secara ketat dari menjalani dua kursus Pluralsight oleh Jonathan Keyhayias . Layak biaya satu bulan untuk berlangganan plus untuk pergi melalui dua programnya.

Pertama, hanya beberapa tempat menarik yang menurut saya akan membantu (atau paling menarik):

  • Ketika sesi Diperpanjang Acara dimulai itu akan memiliki sebagian memori yang dialokasikan ke ruang buffer untuk menyimpan data yang dihasilkan oleh peristiwa sesi. Dalam sesi Anda ini diatur ke nilai default 4MB
  • Ada beberapa target yang tersedia untuk digunakan. Target ini baik synchronousatau asynchronousdalam cara mereka menerima data. Dua target yang paling umum digunakan adalah Target File dan Ring Buffer keduanya tidak sinkron. Artikel BOL di sini menunjukkan tipe setiap target .
  • Ini MAX_DISPATCH_LATENCYadalah opsi konfigurasi yang mengontrol kapan data acara dikirim ke target. Pengiriman hanya terjadi untuk target yang tidak sinkron. Ada dua kondisi yang akan menyebabkan data acara dikirim: (1) buffer memori untuk sesi penuh atau (2) data acara di buffer melebihi MAX_DISPATCH_LATENCYopsi yang dikonfigurasi sesi .
  • Saat Anda membuka Live Data Viewer, itu akan melampirkan target tambahan ke sesi acara yang disebut "target streaming". Ini akan menerima siaran langsung acara saat buffer memori sedang dikirim. Ini sebenarnya juga akan mengubah latensi pengiriman yang terkait dengan sesi menjadi 3 detik untuk mendapatkan tampilan waktu dekat dari sesi tersebut.

Sekarang ke poin-poin spesifik dalam pertanyaan Anda:

Masalah yang saya alami adalah bahwa tampaknya fitur Acara Langsung menggunakan buffer internal, yang berarti bahwa kadang-kadang saya perlu menjalankan kueri beberapa kali untuk mendapatkan informasi untuk ditampilkan di jendela. Karena itu saya punya pertanyaan dua bagian untuk ditanyakan

Saya tidak sadar bahwa ini melakukan hal lain selain dari yang saya nyatakan di atas. Saya berharap bahwa acara itu ditangkap itu belum memenuhi ambang batas yang diperlukan untuk dikirim ke penampil data langsung Anda. Saya menguji ini dengan permintaan berikut dari AdventureWorks2012:

SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO

Menggunakan konfigurasi sesi acara Anda, dengan pengecualian bahwa saya memfilter untuk hanya mengambil data untuk AdventureWorks2012database pada contoh lokal saya, saya dapat melihat data target untuk sesi ini dan menemukan kueri ditangkap:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Menjalankan permintaan ini sekali lagi pada akhirnya akan membuatnya dikirim dan penampil data menampilkan satu peristiwa. Sekarang jika Anda benar-benar ingin melihat semua acara yang ditampilkan hanya STOPsesi dan buffer akan dikirim sepenuhnya. Saya melihat ini setelah saya menghentikan sesi saya:

masukkan deskripsi gambar di sini

1. Apakah ada cara untuk mengatasi keterlambatan ini agar acara ditampilkan di live feed? (Saya melakukan ini pada database lokal sehingga kinerja tidak menjadi masalah)

Saya pikir Anda bisa mengubah MAX_MEMORYke nilai yang lebih rendah yang akan menunjukkan ukuran buffer kecil untuk menangkap peristiwa. Namun nilai terendah yang dapat Anda atur di SQL Server 2012 adalah 200KB, yang kueri saya gunakan tidak memenuhi batas yang menyebabkannya segera dikirim. Satu-satunya hal yang dapat saya lakukan adalah paling banyak menjalankan kueri yang akan menyebabkan buffer tercapai dan peristiwa sebelumnya yang ditangkap dikirim:

SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;

2.Apakah live feed cara terbaik untuk memvisualisasikan data Acara yang Diperpanjang? Apakah ada alat lain di SSMS atau tidak yang lebih baik disesuaikan dengan kasus penggunaan saya?

Bukannya aku tahu saat ini. Saya akan menyarankan metode terbaik untuk mengeluarkan data segera setelah itu terjadi adalah permintaan XML untuk ring_buffertarget dan hanya rusak itu. Saya dapat mengulangi contoh di atas dan segera setelah saya menjalankan kueri di bawah ini saya melihat acara tersebut.

-- 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)

masukkan deskripsi gambar di sini


sumber
3
Jawaban yang bagus, sangat detail. Hanya poin, dan itu lebih menarik daripada diskusi nyata; Anda menyebut Johnathan Kehayias dan, saya setuju, kursus Pluralsight-nya bernilai 100% dari biaya 1 bulan. Namun, dia memiliki sebuah blog di mana dia berbicara tentang bagaimana dia membenci target Ring Buffer. Itu dari 2014, jadi mungkin itu berubah sekarang tapi itu bacaan yang menarik: sqlskills.com/blogs/jonathan/…
Kalmino
1

.Net 4.7.2 memiliki perbaikan untuk mengurangi penundaan awal untuk tampilan acara saat menggunakan target langsung.

David Shiflet
sumber
2
Bisakah Anda memberikan referensi untuk mendukung jawaban Anda? Saat ini jawaban Anda tidak banyak membantu.
John aka hot2use