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
synchronous
atau asynchronous
dalam 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_LATENCY
adalah 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_LATENCY
opsi 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 AdventureWorks2012
database pada contoh lokal saya, saya dapat melihat data target untuk sesi ini dan menemukan kueri ditangkap:
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 STOP
sesi dan buffer akan dikirim sepenuhnya. Saya melihat ini setelah saya menghentikan sesi saya:
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_MEMORY
ke 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_buffer
target 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)