Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Database SQL di Microsoft Fabric
Artikel ini menjelaskan kapan dan cara menggunakan target Extended Events. Untuk setiap target, artikel ini menjelaskan:
- Kemampuannya dalam mengumpulkan dan melaporkan data peristiwa
- Contoh sesi acara menggunakan target
Tabel berikut menjelaskan ketersediaan setiap jenis target di platform SQL yang berbeda.
| Jenis target | SQL Server | Database Azure SQL dan database SQL di Fabric | Azure SQL Managed Instance |
|---|---|---|---|
| event_file | Ya | Ya | Ya |
| ring_buffer | Ya | Ya | Ya |
| event_stream | Ya | Ya | Ya |
| Histogram | Ya | Ya | Ya |
| event_counter | Ya | Ya | Ya |
| pencocokan_pasangan | Ya | Tidak. | Tidak. |
| tujuan sinkronisasi klasik etw | Ya | Tidak. | Tidak. |
Kecuali dicatat secara berbeda, target memproses data yang mereka terima secara asinkron.
Untuk memanfaatkan artikel ini dengan maksimal, Anda harus:
- Pahami dasar-dasar Acara yang Diperluas, seperti yang dijelaskan dalam Mulai Cepat: Acara yang Diperluas.
- Gunakan versi terbaru SQL Server Management Studio (SSMS).
target event_file
Target event_file akan menulis output sesi kejadian dari buffer memori ke dalam file disk atau ke dalam blob di penyimpanan Azure.
Anda menentukan
filenameparameter dalamADD TARGETklausa. Ekstensi file harusxel.Nama file yang Anda pilih digunakan oleh sistem sebagai awalan di mana nilai numerik berbasis tanggal waktu ditambahkan, diikuti oleh
xelekstensi.Anda dapat secara opsional menentukan
MAX_FILE_SIZEparameter . Ini mendefinisikan ukuran maksimum dalam megabyte (MB) tempat file dapat tumbuh sebelum file baru dibuat.Anda dapat secara opsional menentukan
MAX_ROLLOVER_FILESopsi untuk memilih jumlah maksimum file yang akan disimpan dalam sistem file selain file saat ini. Nilai defaultnya adalahUNLIMITED. KetikaMAX_ROLLOVER_FILESdievaluasi, jika jumlah file melebihiMAX_ROLLOVER_FILESpengaturan, file yang lebih lama akan dihapus.
Penting
Bergantung pada peristiwa yang ditambahkan ke sesi, file yang dihasilkan oleh event_file target mungkin berisi data sensitif. Tinjau sistem file dengan hati-hati dan bagikan izin pada direktori dan file individual .xel , termasuk akses yang diwariskan, untuk menghindari pemberian akses baca yang tidak perlu. Ikuti prinsip hak istimewa paling sedikit. Untuk mengurangi risiko pengumpulan data sensitif secara tidak sengaja, hindari sesi peristiwa yang berjalan lama jika mereka dapat mengumpulkan data sensitif.
Catatan
Azure SQL Database dan Azure SQL Managed Instance hanya mendukung blob di Azure Storage sebagai nilai filename parameter.
event_file Untuk contoh kode untuk Azure SQL Database, database SQL di Fabric, atau Azure SQL Managed Instance, lihat Membuat sesi peristiwa dengan target event_file di Azure Storage.
Membuat sesi acara dengan target event_file di sistem berkas lokal
Untuk panduan membuat sesi kejadian menggunakan event_file penyimpanan file lokal, dengan SSMS atau T-SQL, lihat Quickstart: Extended Events.
Buat sesi acara dengan target event_file di Azure Storage
Untuk deskripsi terperinci tentang cara membuat akun penyimpanan di Azure Storage, lihat Membuat akun penyimpanan. Anda dapat membuat akun penyimpanan menggunakan portal Microsoft Azure, PowerShell, Azure SQL, templat ARM, atau templat Bicep. Gunakan akun yang:
- Akun
Standard general-purpose v2. -
HotMenggunakan tingkat akses blob. - Jika menggunakan SQL Server di Azure Virtual Machine (Azure VM), akun penyimpanan harus berada di wilayah Azure yang sama dengan Azure VM Anda.
- Tidak memiliki namespace hierarkis yang diaktifkan.
Selanjutnya, buat kontainer di akun penyimpanan ini menggunakan portal Microsoft Azure. Anda juga dapat membuat kontainer menggunakan PowerShell, atau menggunakan Azure CLI.
Perhatikan nama akun penyimpanan dan kontainer yang Anda buat. Anda menggunakannya dalam langkah-langkah berikut.
Untuk membaca dan menulis data peristiwa, mesin database memerlukan akses tertentu. Anda memberikan akses ini secara berbeda tergantung pada pilihan jenis autentikasi Anda: identitas terkelola atau autentikasi berbasis rahasia dengan token tanda tangan akses bersama (SAS).
Untuk mengautentikasi ke Azure Storage, mesin database memerlukan kredensial cakupan server atau kredensial cakupan database, yang memberi tahunya jenis autentikasi apa yang akan digunakan, dan menyediakan rahasia untuk autentikasi berbasis rahasia. Membuat kredensial ini memerlukan CONTROL izin database.
Untuk SQL Server dan Azure SQL Managed Instance, izin ini diperlukan dalam master database. Secara default, izin dipegang oleh anggota db_owner peran database di master, dan oleh anggota sysadmin peran server pada instans. Untuk Database Azure SQL dan basis data SQL di Fabric, izin ini dipegang oleh pemilik basis data (dbo), anggota peran basis data db_owner, dan administrator server logis.
Setelah kredensial dibuat, langkah-langkah yang tersisa untuk membuat sesi acara tidak memerlukan CONTROL izin. Lihat Izin untuk izin tertentu yang diperlukan.
Memberikan akses menggunakan identitas terkelola
Jika menggunakan identitas terkelola dengan autentikasi Microsoft Entra, Anda menetapkan peran RBAC Kontributor Data Blob Penyimpanan untuk kontainer kepada identitas terkelola yang digunakan oleh mesin basis data. Untuk informasi selengkapnya, lihat yang berikut ini berdasarkan platform SQL:
- Identitas terkelola dari server logis Azure SQL Database.
- Identitas terkelola dari instans Azure SQL yang dikelola.
- Identitas terkelola Azure VM yang menghosting instans SQL Server Anda. Untuk informasi selengkapnya, lihat Cara kerja identitas terkelola untuk sumber daya Azure dengan komputer virtual Azure.
- Identitas terkelola dari instans SQL Server yang mendukung Arc.
Setelah penetapan peran RBAC sudah ditetapkan, ikuti langkah-langkah berikut:
Buat kredensial menggunakan T-SQL.
Sebelum menjalankan batch T-SQL berikut, lakukan perubahan berikut:
- Dalam ketiga kemunculan
https://<storage-account-name>.blob.core.windows.net/<container-name>, ganti<storage-account-name>dengan nama akun penyimpanan Anda, dan ganti<container-name>dengan nama kontainer Anda. Pastikan bahwa tidak ada garis miring di akhir URL.
Membuat kredensial cakupan server: (Berlaku untuk SQL Server, Azure SQL Managed Instance)
Menggunakan alat klien seperti SQL Server Management Studio, buka jendela kueri baru, sambungkan ke
masterdatabase pada instans tempat Anda ingin membuat sesi peristiwa, dan tempelkan batch T-SQL berikut./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';Membuat kredensial cakupan database: (Berlaku untuk Azure SQL Database, Azure SQL Managed Instance, database SQL di Fabric)
Menggunakan alat klien seperti SQL Server Management Studio, buka jendela kueri baru, sambungkan ke database pengguna tempat Anda membuat sesi peristiwa, dan tempelkan batch T-SQL berikut. Pastikan Anda tersambung ke database pengguna Anda, dan bukan ke
masterdatabase./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';- Dalam ketiga kemunculan
Kemudian, ikuti langkah-langkah untuk membuat sesi peristiwa di SSMS dengan target event_file di Azure Storage.
Memberikan akses menggunakan token tanda tangan akses bersama (SAS)
Jika menggunakan autentikasi berbasis rahasia, Anda membuat token tanda tangan akses bersama (SAS) untuk kontainer. Untuk menggunakan jenis autentikasi ini, opsi Izinkan akses kunci akun penyimpanan harus diaktifkan untuk akun penyimpanan. Untuk informasi selengkapnya, lihat Mencegah otorisasi Kunci Bersama untuk akun Azure Storage.
Di portal Microsoft Azure, navigasikan ke akun penyimpanan dan kontainer yang Anda buat. Pilih kontainer, dan navigasi ke Pengaturan > Token akses bersama.
Token SAS harus memenuhi persyaratan berikut:
-
Izin diatur ke
Read,Write,Delete,List. - Waktu mulai dan waktu kedaluwarsa harus mencakup durasi sesi acara. Token SAS yang Anda buat hanya berfungsi dalam interval waktu ini.
- Untuk Database Azure SQL, Azure SQL Managed Instance, dan database SQL di Fabric, token SAS tidak boleh memiliki batasan alamat IP.
Pilih tombol Buat token SAS dan URL . Token SAS ada di kotak token SAS Blob . Anda dapat menyalinnya untuk digunakan di langkah berikutnya.
Penting
Token SAS menyediakan akses baca dan tulis ke kontainer ini. Perlakukan seperti yang Akan Anda perlakukan kata sandi atau rahasia lainnya.
-
Izin diatur ke
Buat kredensial untuk menyimpan token SAS menggunakan T-SQL.
Sebelum menjalankan batch T-SQL berikut, buat perubahan berikut:
Jika membuat kredensial cakupan server dan menggunakan pernyataan
CREATE MASTER KEY, ganti<password>dengan kata sandi yang kuat yang melindungi kunci master. Untuk informasi selengkapnya, lihat CREATE MASTER KEY.Dalam ketiga kemunculan
https://<storage-account-name>.blob.core.windows.net/<container-name>, ganti<storage-account-name>dengan nama akun penyimpanan Anda, dan ganti<container-name>dengan nama kontainer Anda.SECRETDalam klausa, ganti<sas-token>dengan token SAS yang Anda salin di langkah sebelumnya.
Membuat kredensial cakupan server: (Berlaku untuk SQL Server, Azure SQL Managed Instance)
Menggunakan alat klien seperti SQL Server Management Studio, buka jendela kueri baru, sambungkan ke
masterdatabase pada instans tempat Anda membuat sesi peristiwa, dan tempelkan batch T-SQL berikut./* Create a master key to protect the secret of the credential */ IF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>' /* The name of the credential must match the URL of the blob container. */; IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';Membuat kredensial cakupan database: (Berlaku untuk Azure SQL Database, Azure SQL Managed Instance, database SQL di Fabric)
Menggunakan alat klien seperti SQL Server Management Studio, buka jendela kueri baru, sambungkan ke database tempat Anda membuat sesi peristiwa, dan tempelkan batch T-SQL berikut. Pastikan Anda tersambung ke database pengguna Anda, dan bukan ke
masterdatabase./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';Kemudian, ikuti langkah-langkah di bagian berikutnya untuk membuat sesi peristiwa di SSMS dengan target event_file di Azure Storage.
Buat sesi acara di SSMS dengan target event_file di Azure Storage.
Setelah kredensial yang menyediakan akses ke kontainer penyimpanan dibuat, Anda dapat membuat sesi peristiwa. Tidak seperti membuat kredensial, membuat sesi acara tidak memerlukan CONTROL izin. Setelah kredensial dibuat, Anda dapat membuat sesi acara meskipun Anda memiliki izin yang lebih terbatas. Lihat Izin untuk izin tertentu yang diperlukan.
Untuk membuat sesi acara baru di SSMS:
Untuk SQL Server dan Azure SQL Managed Instance, perluas node Extended Events di bawah folder Manajemen . Untuk Database Azure SQL dan database SQL di Fabric, perluas node Extended Events di bawah database.
Klik kanan pada folder Sesi , dan pilih Sesi Baru....
Pada halaman Umum , masukkan nama untuk sesi, yaitu
example-sessionuntuk sampel kode berikut.Pada halaman Peristiwa , pilih satu atau beberapa peristiwa untuk ditambahkan ke sesi. Misalnya, Anda dapat memilih
sql_batch_startingacara.Pada halaman Penyimpanan Data , pilih
event_filesebagai jenis target. Tempelkan URL kontainer penyimpanan di kotak URL Penyimpanan . Ketik garis miring (/) di akhir URL ini, diikuti dengan nama file (blob). Contohnya,https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.Sekarang setelah sesi dikonfigurasi, Anda dapat secara opsional memilih tombol Skrip untuk membuat skrip T-SQL sesi, untuk menyimpannya untuk nanti.
Pilih OK untuk membuat sesi.
Di Object Explorer, perluas folder Sesi untuk melihat sesi peristiwa yang Anda buat. Secara default, sesi tidak dimulai saat dibuat. Untuk memulai sesi, klik kanan pada nama sesi, dan pilih Mulai Sesi. Anda nantinya dapat menghentikannya dengan memilih Hentikan Sesi setelah sesi berjalan.
Saat batch T-SQL dijalankan, sesi menulis event sql_batch_starting ke blob example-session.xel dalam kontainer penyimpanan.
Catatan
Untuk SQL Managed Instance, alih-alih menempelkan URL kontainer penyimpanan di halaman Penyimpanan data , gunakan tombol Skrip untuk membuat skrip T-SQL sesi. Tentukan URL kontainer sebagai nilai untuk filename argumen dan jalankan skrip untuk membuat sesi.
Buatlah sesi acara dengan sasaran event_file di Azure Storage dalam T-SQL
Berikut adalah contoh CREATE EVENT SESSION dengan klausa ADD TARGET yang menambahkan target yang berbasis Azure Storage.
CREATE EVENT SESSION [example-session]
ON SERVER
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.event_file
(
SET filename = N'https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel'
)
GO
Untuk menggunakan contoh ini di Azure SQL Database atau database SQL di Fabric, ganti ON SERVER dengan ON DATABASE.
Memecahkan masalah sesi kejadian dengan menargetkan event_file di Azure Storage
Daftar berikut berisi kesalahan yang mungkin Anda temui saat memulai sesi peristiwa yang diperluas yang menggunakan Azure Storage, dengan kemungkinan penjelasan untuk kesalahan tersebut.
-
Sistem operasi mengembalikan kesalahan 5: 'Akses ditolak.'
- Jika menggunakan autentikasi identitas terkelola:
- Identitas terkelola yang digunakan oleh mesin basis data tidak memiliki penetapan peran RBAC yang diperlukan. Untuk informasi selengkapnya, lihat Memberikan akses menggunakan identitas terkelola.
-
Firewall akun penyimpanan diaktifkan dan pengecualian untuk memungkinkan layanan Azure tepercaya mengakses akun penyimpanan juga diaktifkan, tetapi
Microsoft.Sql/serversinstans sumber daya untuk server logis belum ditambahkan ke daftar instans sumber daya yang diberikan akses. Untuk informasi selengkapnya, lihat Pemberian akses dari instans sumber daya Azure. - Jika menggunakan perimeter keamanan jaringan dengan mode yang diberlakukan, database dan akun penyimpanan tidak berada dalam perimeter yang sama.
- Jika menggunakan autentikasi token SAS:
- Akun penyimpanan firewall diaktifkan. Ini tidak didukung untuk sesi acara yang menggunakan autentikasi token SAS.
- Token SAS tidak memiliki izin yang memadai, atau telah kedaluwarsa. Untuk informasi selengkapnya, lihat Memberikan akses menggunakan token SAS.
- Jika menggunakan perimeter keamanan jaringan dengan mode yang diberlakukan, aturan akses untuk memungkinkan komunikasi keluar yang tidak dibatasi dari database dan komunikasi masuk yang tidak dibatasi ke akun penyimpanan tidak diberlakukan.
- Jika menggunakan autentikasi identitas terkelola:
-
Sistem operasi mengembalikan kesalahan 86: 'Kata sandi jaringan yang ditentukan tidak benar.'
- Tidak ada kredensial cakupan database (untuk Azure SQL Database) atau kredensial cakupan server (untuk Azure SQL Managed Instance atau SQL Server) dengan nama yang cocok dengan URL kontainer blob. Untuk informasi selengkapnya, lihat contoh untuk Memberikan akses menggunakan identitas terkelola atau Memberikan akses menggunakan token SAS.
- Nama kredensial berakhir dengan garis miring (
/). Nama kredensial harus diakhiri dengan nama kontainer, tanpa menyertakan garis miring di akhir.
-
Sistem operasi mengembalikan kesalahan 3: 'Sistem tidak dapat menemukan jalur yang ditentukan.'
- Kontainer yang ditentukan dalam URL kontainer blob tidak ada.
-
Sistem operasi mengembalikan kesalahan 13: 'Data tidak valid.'
- Ada kebijakan kekekalan pada kontainer blob. Penyimpanan immutable tidak didukung untuk sesi event.
- Akun penyimpanan memiliki namespace hierarkis yang diaktifkan. Akun penyimpanan dengan namespace hierarkis yang diaktifkan tidak mendukung sesi acara.
sys.fn_xe_file_target_read_file() fungsi
Target event_file menyimpan data yang diterimanya dalam format biner yang tidak dapat dibaca manusia. Fungsi ini sys.fn_xe_file_target_read_file memungkinkan Anda mewakili konten xel file sebagai set baris relasional. Untuk informasi selengkapnya, termasuk contoh penggunaan, lihat sys.fn_xe_file_target_read_file.
target ring_buffer
ring_buffer Target berguna dengan cepat memulai sesi peristiwa dan mengumpulkan data peristiwa hanya dalam memori. Ketika memori yang tersedia dalam buffer cincin digunakan oleh peristiwa, peristiwa yang lebih lama akan dibuang. Saat Anda menghentikan sesi peristiwa, semua output sesi yang menuju ke target ring_buffer juga akan dibuang.
Anda menggunakan data dari ring_buffer target dengan mengonversinya ke XML, seperti yang diperlihatkan dalam contoh berikut. Selama konversi ini, data apa pun yang tidak cocok dengan dokumen XML 4-MB dihilangkan. Oleh karena itu, bahkan jika Anda mengambil lebih banyak peristiwa di buffer cincin dengan menggunakan nilai yang lebih besar MAX_MEMORY (atau dengan meninggalkan parameter ini pada nilai defaultnya), Anda mungkin tidak dapat menggunakan semuanya karena batas 4-MB pada ukuran dokumen XML, mempertimbangkan overhead markup XML dan string Unicode.
Anda tahu bahwa konten buffer cincin dihilangkan selama konversi ke XML jika truncated atribut dalam dokumen XML diatur ke 1, misalnya:
<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">
Petunjuk / Saran
Saat menambahkan ring_buffer target, atur parameternya MAX_MEMORY ke 1.024 KB atau kurang. Menggunakan nilai yang lebih besar dapat meningkatkan konsumsi memori secara tidak perlu.
Secara default, MAX_MEMORY untuk ring_buffer target tidak terbatas di SQL Server, dan dibatasi hingga 32 MB di Azure SQL Database, Azure SQL Managed Instance, dan database SQL di Fabric.
Membuat sesi acara dengan target ring_buffer
Berikut adalah contoh pembuatan sesi peristiwa dengan ring_buffer target untuk mengumpulkan lock_acquired peristiwa, membatasi jumlah total peristiwa di buffer cincin menjadi 100. Dalam contoh ini, MAX_MEMORY parameter muncul dua kali: sekali untuk mengatur ring_buffer memori target menjadi 1.024 KB, dan sekali untuk mengatur memori buffer sesi peristiwa ke 2 MB.
Untuk menggunakan contoh ini di Azure SQL Database atau database SQL di Fabric, ganti ON SERVER dengan ON DATABASE.
CREATE EVENT SESSION ring_buffer_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 100,
MAX_MEMORY = 1024
)
WITH
(
MAX_MEMORY = 2 MB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Untuk memulai sesi peristiwa, jalankan pernyataan berikut:
ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;
Untuk melihat data kejadian yang dikumpulkan di ring buffer di SSMS, perluas node sesi dan pilih package0.ping_buffer target. Data ditampilkan dalam XML.
Untuk melihat data peristiwa dari ring_buffer target dalam kumpulan baris relasional saat sesi aktif, Anda menggunakan ekspresi XQuery untuk mengonversi XML ke data relasional. Contohnya:
;WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST (xst.target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS xst
INNER JOIN sys.dm_xe_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'ring_buffer_lock_acquired'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
SELECT CAST (NodeData.query('.') AS XML) AS EventInfo
FROM RingBuffer AS rb
CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
EventInfo.value('(event/@name)[1]','sysname') AS event_name,
EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;
target event_stream
Target event_stream hanya dapat digunakan dalam program .NET yang ditulis dalam bahasa seperti C#. Pengembang dapat mengakses aliran peristiwa melalui kelas .NET Framework di Microsoft.SqlServer.XEvents.Linq namespace. Target ini secara implisit ada dalam sesi peristiwa apa pun. Ini tidak dapat ditambahkan menggunakan T-SQL.
Untuk informasi selengkapnya, lihat sys.fn_MSxe_read_event_stream.
Jika Anda mengalami kesalahan 25726, The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. saat membaca dari event_stream target, itu berarti bahwa aliran peristiwa diisi dengan data lebih cepat daripada yang dapat digunakan klien untuk mengonsumsi data. Hal ini menyebabkan Mesin Database terputus dari aliran peristiwa untuk menghindari pengaruh performa Mesin Database.
target histogram
Target histogram menghitung jumlah kemunculan peristiwa untuk nilai yang berbeda dalam bidang atau tindakan. Untuk setiap nilai yang berbeda, digunakan penampung hitung yang terpisah.
histogram Target memproses data yang diterimanya secara sinkron.
Parameter SOURCE_TYPE mengontrol perilaku histogram target:
-
SOURCE_TYPE = 0: kumpulkan data untuk bidang peristiwa. -
SOURCE_TYPE = 1: kumpulkan data untuk tindakan. Ini adalah default.
Nilai SLOTS default parameter adalah 256. Jika Anda menetapkan nilai lain, nilai dibulatkan ke atas ke daya 2 berikutnya. Misalnya, SLOTS = 59 akan dibulatkan hingga 64. Jumlah maksimum slot histogram untuk histogram target adalah 16.384.
Saat menggunakan histogram sebagai target, Terkadang Anda mungkin melihat hasil yang tidak terduga. Beberapa peristiwa mungkin tidak muncul di slot yang diharapkan, sementara slot lain mungkin menunjukkan jumlah peristiwa yang lebih tinggi dari yang diharapkan. Ini dapat terjadi jika kollisi hash terjadi saat mengalokasikan kejadian ke slot. Meskipun ini jarang terjadi, jika tabrakan hash terjadi, peristiwa yang harus dihitung dalam satu slot dihitung di slot lain. Untuk alasan ini, perawatan harus diambil dengan asumsi bahwa peristiwa tidak terjadi hanya karena jumlah dalam slot tertentu menunjukkan sebagai nol.
Sebagai contoh, pertimbangkan skenario berikut:
- Anda mempersiapkan sesi untuk Extended Events, dengan
histogramsebagai target dan mengelompokkan peristiwa berdasarkanobject_id, untuk mengumpulkan statistik eksekusi prosedur tersimpan. - Anda menjalankan prosedur tersimpan
A. Kemudian, Anda menjalankan prosedur tersimpanB.
Jika fungsi hash mengembalikan nilai yang sama untuk object_id kedua prosedur tersimpan, histogram menunjukkan A dijalankan dua kali saat B tidak muncul.
Untuk mengurangi masalah ini ketika jumlah nilai yang berbeda relatif kecil, atur jumlah slot histogram yang lebih tinggi dari kuadrat nilai berbeda yang diharapkan. Misalnya, jika histogram target telah SOURCE diatur ke table_name bidang peristiwa, dan ada 20 tabel dalam database, maka 20*20 = 400. Daya berikutnya 2 lebih besar dari 400 adalah 512, yang merupakan jumlah slot yang direkomendasikan dalam contoh ini.
Setiap histogram target menerima data dari satu sumber (bidang peristiwa atau tindakan) dan hanya berisi satu histogram. Tidak dimungkinkan untuk menambahkan lebih dari satu target dengan jenis yang sama per sesi peristiwa. Anda juga tidak dapat memiliki lebih dari satu jenis sumber per histogram target. Oleh karena itu, sesi peristiwa baru diperlukan untuk melacak tindakan atau kolom peristiwa yang berbeda dalam target terpisah histogram.
Membuat sesi peristiwa dengan target histogram
Berikut adalah contoh membuat sesi peristiwa dengan histogram target.
Untuk menggunakan contoh ini di Azure SQL Database atau database SQL di Fabric, ganti ON SERVER dengan ON DATABASE.
CREATE EVENT SESSION histogram_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
ACTION (sqlos.system_thread_id)
)
ADD TARGET package0.histogram
(
SET FILTERING_EVENT_NAME = N'sqlserver.lock_acquired',
SLOTS = 16,
SOURCE = N'sqlos.system_thread_id',
SOURCE_TYPE = 1
);
Dalam klausa ADD TARGET ... (SET ...), parameter target SOURCE_TYPE diatur ke 1, yang berarti histogram target melacak tindakan.
Klausa ADD EVENT ... (ACTION ...) menambahkan tindakan sqlos.system_thread_id pada peristiwa. Parameter SOURCE diatur ke sqlos.system_thread_id agar ID utas sistem yang dikumpulkan oleh tindakan ini dapat digunakan sebagai sumber data untuk sasaran histogram. Target histogram pada contoh ini menghitung jumlah event lock_acquired pada setiap utas sistem yang memperoleh lock saat sesi aktif.
Untuk memulai sesi peristiwa, jalankan pernyataan berikut:
ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;
Untuk melihat data histogram yang dikumpulkan di SSMS, perluas simpul sesi dan pilih package0.histogram target. Data ditampilkan dalam grid dua kolom. Setiap baris mewakili kelompok nilai yang berbeda dan jumlah kemunculannya.
Berikut tampilan data yang diambil oleh histogram target dalam contoh ini. Nilai dalam value kolom adalah system_thread_id nilai. Misalnya, sebanyak 236 kunci diperoleh oleh thread sistem 6540.
value count
----- -----
6540 236
9308 91
9668 74
10144 49
5244 44
2396 28
Berikut adalah contoh membaca data dari histogram target dengan T-SQL:
WITH histogram_target
AS (SELECT TRY_CAST (st.target_data AS XML) AS target_data
FROM sys.dm_xe_sessions AS s
INNER JOIN sys.dm_xe_session_targets AS st
ON s.address = st.event_session_address
WHERE s.name = 'event-session-name-placeholder'),
histogram
AS (SELECT hb.slot.value('(@count)[1]', 'bigint') AS slot_count,
hb.slot.value('(value/text())[1]', 'nvarchar(max)') AS slot_value
FROM histogram_target AS ht
CROSS APPLY ht.target_data.nodes('/HistogramTarget/Slot') AS hb(slot))
SELECT slot_value,
slot_count
FROM histogram;
target event_counter
Target event_counter menghitung berapa kali setiap peristiwa yang ditentukan terjadi.
Target event_counter tidak memiliki parameter dan memproses data yang diterimanya secara sinkron.
Membuat sesi peristiwa dengan target event_counter
Berikut adalah contoh membuat sesi peristiwa dengan event_counter target. Sesi menghitung empat checkpoint_begin peristiwa pertama dan kemudian berhenti menghitung karena predikatnya membatasi jumlah peristiwa yang dikirim ke target ke empat. Anda dapat menghasilkan peristiwa checkpoint_begin untuk contoh ini dengan menjalankan perintah CHECKPOINT.
Untuk menggunakan contoh ini di Azure SQL Database atau database SQL di Fabric, ganti ON SERVER dengan ON DATABASE.
CREATE EVENT SESSION event_counter_checkpoint_begin
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
(
WHERE package0.counter <= 4
)
ADD TARGET package0.event_counter
WITH
(
MAX_MEMORY = 4096 KB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Untuk memulai sesi peristiwa, jalankan pernyataan berikut:
ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;
Untuk melihat data yang dikumpulkan di SSMS, perluas simpul sesi dan pilih package0.event_counter target. Data ditampilkan dalam tata letak tiga kolom. Setiap baris mewakili peristiwa dengan hitungan kemunculannya.
Berikut adalah bagaimana data yang diambil oleh event_counter target dalam contoh ini akan terlihat setelah empat titik pemeriksaan terjadi.
package_name event_name count
------------ ---------------- -----
sqlserver checkpoint_begin 4
target pair_matching
Target pair_matching memungkinkan Anda mendeteksi peristiwa mulai yang terjadi tanpa peristiwa akhir yang sesuai. Misalnya, Anda dapat menemukan lock_acquired peristiwa tanpa peristiwa yang cocok lock_released , yang mungkin menunjukkan bahwa transaksi yang berjalan lama memegang kunci.
Acara Ekstensi tidak secara otomatis mencocokkan peristiwa awal dan akhir. Sebagai gantinya, Anda menentukan logika pencocokan dalam pair_matching spesifikasi target dalam pernyataan CREATE EVENT SESSION. Saat peristiwa awal dan akhir dicocokkan, target membuang pasangan tetapi mempertahankan peristiwa mulai yang tidak cocok.
Membuat sesi acara dengan target pencocokan_pasangan
Untuk contoh ini, kita membuat tabel contoh bernama T1, menyisipkan tiga baris, dan mendapatkan object_id nilai untuk tabel ini. Untuk kesederhanaan, kita membuat tabel dalam tempdb database dalam contoh ini. Jika Anda menggunakan database yang berbeda, sesuaikan nama database dalam kode contoh T-SQL yang mengikutinya.
CREATE TABLE T1 (id INT PRIMARY KEY);
INSERT INTO T1 (id)
VALUES (1), (2), (3);
SELECT OBJECT_ID('T1') AS object_id;
-- object_id = 1029578706
Sesi peristiwa berikut mengumpulkan dua peristiwa, lock_acquired dan lock_released. Ini juga memiliki dua target. Salah satunya adalah event_counter target yang menyediakan jumlah kejadian untuk setiap peristiwa. Yang lain adalah pair_matching target yang mendefinisikan logika untuk mencocokkan peristiwa mulai lock_acquired dan peristiwa akhir lock_released menjadi pasangan.
Urutan bidang yang dibatasi koma yang ditetapkan dan BEGIN_MATCHING_COLUMNSEND_MATCHING_COLUMNS harus sama. Tidak ada tab atau baris baru yang diizinkan di antara bidang yang disebutkan dalam nilai yang dibatasi koma, meskipun spasi diizinkan.
Dalam definisi sesi acara, kami menggunakan predikat acara untuk mengumpulkan hanya acara yang ada di tempdb database di mana object_id dalam acara sesuai dengan ID objek dari tabel T1. Sesuaikan predikat dalam WHERE klausa untuk menggunakan ID objek tabel Anda.
Untuk menggunakan contoh ini di Azure SQL Database atau database SQL di Fabric, ganti ON SERVER dengan ON DATABASE.
CREATE EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
),
ADD EVENT sqlserver.lock_released
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
)
ADD TARGET package0.event_counter,
ADD TARGET package0.pair_matching
(
SET BEGIN_EVENT = N'sqlserver.lock_acquired',
BEGIN_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
END_EVENT = N'sqlserver.lock_released',
END_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
RESPOND_TO_MEMORY_PRESSURE = 1
)
WITH
(
MAX_MEMORY = 8192 KB,
MAX_DISPATCH_LATENCY = 15 SECONDS
);
Untuk memulai sesi peristiwa, jalankan pernyataan berikut:
ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;
Mulai transaksi yang memperbarui tabel T1, tetapi jangan komit atau batal. Ini memastikan bahwa ada kunci yang didapatkan tetapi tidak dilepaskan.
BEGIN TRANSACTION;
UPDATE T1
SET id = id + 1;
Periksa output dari setiap target sesi acara pair_matching_lock_acquired_released di SSMS.
Target event_counter memiliki output berikut, menunjukkan bahwa satu kunci tetap tidak dilepaskan. Namun, target ini tidak menunjukkan detail dari kunci itu.
package_name event_name count
------------ ---------- -----
sqlserver lock_acquired 4
sqlserver lock_released 3
Target pair_matching memiliki output berikut, yang dipangkas untuk kejelasan. Seperti yang event_counter output menyarankan, kita memang melihat satu baris untuk peristiwa yang tidak berpasangan lock_acquired, dengan informasi lebih lanjut tentang peristiwa tersebut.
package_name event_name timestamp associated_object_id database_id database_name
------------ ------------ --------- ------------- ----------- -------------
sqlserver lock_acquired 2025-10-01 20:06:07.1890000 1029578706 2 tempdb
Gulung balik transaksi.
ROLLBACK;
Jika Anda menambahkan tindakan ke peristiwa yang dikumpulkan oleh pair_matching target, data tindakan juga dikumpulkan. Misalnya, Anda dapat menyertakan teks T-SQL yang disediakan oleh tindakan sqlserver.sql_text dengan acara tersebut. Dalam contoh ini, akan mengumpulkan kueri yang memperoleh kunci.
target etw_classic_sync_target
Di SQL Server, Extended Events dapat beroperasi dengan Event Tracing for Windows (ETW) untuk memantau aktivitas sistem. Untuk informasi selengkapnya, lihat:
- Pelacakan Peristiwa untuk target Windows
- Memantau Aktivitas Sistem Menggunakan Kejadian yang Diperluas
Target ETW ini memproses data yang diterimanya secara sinkron.