Target untuk Kejadian yang Diperluas
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Artikel ini menjelaskan kapan dan cara menggunakan target Extended Events. Untuk setiap target, artikel ini menjelaskan:
- Kemampuannya dalam mengumpulkan dan melaporkan data yang dikirim oleh peristiwa
- Parameternya, kecuali di mana parameternya jelas sendiri
Tabel berikut ini menjelaskan ketersediaan setiap jenis target di mesin database yang berbeda.
Jenis target | SQL Server | Azure SQL Database | Instans Terkelola Azure SQL |
---|---|---|---|
etw_classic_sync_target | Ya | No | Tidak |
event_counter | Ya | Ya | Ya |
event_file | Ya | Ya | Ya |
event_stream | Ya | Ya | Ya |
Histogram | Ya | Ya | Ya |
pair_matching | Ya | No | Tidak |
ring_buffer | Ya | Ya | Ya |
Prasyarat
Untuk memanfaatkan artikel ini dengan maksimal, Anda harus:
Pahami dasar-dasar Acara yang Diperluas, seperti yang dijelaskan dalam Mulai Cepat: Acara yang Diperluas.
Telah menginstal versi terbaru SQL Server Management Studio (SSMS). Untuk informasi selengkapnya, lihat Mengunduh SQL Server Management Studio (SSMS).
Di SSMS, ketahui cara menggunakan Object Explorer untuk mengklik kanan simpul target di bawah sesi peristiwa Anda, agar mudah melihat data output.
Parameter, tindakan, dan bidang
Pernyataan CREATE EVENT SESSION adalah pusat dari Extended Events. Untuk menulis pernyataan, Anda memerlukan hal berikut:
- Peristiwa yang ingin Anda tambahkan ke sesi
- Bidang yang terkait dengan setiap peristiwa yang dipilih
- Parameter yang terkait dengan setiap target yang ingin Anda tambahkan ke sesi
Pernyataan SELECT, yang mengembalikan daftar tersebut dari tampilan sistem tersedia untuk disalin dari artikel berikut, di bagian C-nya:
- SELECT dan JOIN Dari Tampilan Sistem untuk Peristiwa yang Diperluas di SQL Server
- Bidang C.4 SELECT untuk suatu peristiwa.
- Parameter C.6 SELECT untuk target.
- Tindakan C.3 SELECT.
Anda dapat melihat parameter, bidang, dan tindakan yang digunakan dalam konteks pernyataan aktual CREATE EVENT SESSION
, dari bagian B2 (perspektif T-SQL).
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, sedangkan sebagian besar target memproses secara asinkron.
Catatan
Azure SQL Managed Instance dan Azure SQL Database tidak mendukung etw_classic_sync_target
target. Sebagai alternatif, gunakan event_file
target dengan blob yang disimpan di Azure Storage.
target event_counter
Target event_counter
menghitung berapa kali setiap peristiwa yang ditentukan terjadi.
Tidak seperti kebanyakan target lainnya:
- Target
event_counter
tidak memiliki parameter. event_counter
Target memproses data yang diterimanya secara sinkron.
Contoh output yang diambil oleh target event_counter
package_name event_name count
------------ ---------- -----
sqlserver checkpoint_begin 4
Selanjutnya adalah CREATE EVENT SESSION
pernyataan yang mengembalikan hasil sebelumnya. Untuk contoh ini, package0.counter
bidang digunakan dalam WHERE
predikat klausul untuk menghentikan penghitungan setelah jumlah mencapai 4.
CREATE EVENT SESSION [event_counter_1]
ON SERVER
ADD EVENT sqlserver.checkpoint_begin -- Test by issuing CHECKPOINT; statements.
(
WHERE [package0].[counter] <= 4 -- A predicate filter.
)
ADD TARGET package0.event_counter
WITH
(
MAX_MEMORY = 4096 KB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
target event_file
Target event_file
menulis output sesi peristiwa dari buffer ke file disk atau ke blob di Azure Storage:
- Anda menentukan
filename
parameter dalamADD TARGET
klausa. Ekstensi file harusxel
. - Nama file yang Anda pilih digunakan oleh sistem sebagai awalan di mana bilangan bulat panjang berbasis tanggal waktu ditambahkan, diikuti oleh
xel
ekstensi.
Catatan
Azure SQL Managed Instance dan Azure SQL Database hanya blob di Azure Storage sebagai nilai filename
parameter.
event_file
Untuk contoh kode untuk SQL Database atau SQL Managed Instance, lihat Kode target File Peristiwa untuk Peristiwa yang Diperluas di SQL Database.
BUAT SESI PERISTIWA dengan target event_file
Berikut adalah contoh CREATE EVENT SESSION
dengan ADD TARGET
klausa event_file
yang menambahkan target.
CREATE EVENT SESSION [locks_acq_rel_eventfile_22]
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
SET
collect_database_name=(1),
collect_resource_description=(1)
ACTION (sqlserver.sql_text,sqlserver.transaction_id)
WHERE
(
[database_name]=N'InMemTest2'
AND
[object_id]=370100359
)
),
ADD EVENT sqlserver.lock_released
(
SET
collect_database_name=1,
collect_resource_description=1
ACTION(sqlserver.sql_text,sqlserver.transaction_id)
WHERE
(
[database_name]=N'InMemTest2'
AND
[object_id]=370100359
)
)
ADD TARGET package0.event_counter,
ADD TARGET package0.event_file
(
SET filename=N'C:\temp\locks_acq_rel_eventfile_22-.xel'
)
WITH
(
MAX_MEMORY=4096 KB,
MAX_DISPATCH_LATENCY=10 SECONDS
);
sys.fn_xe_file_target_read_file() fungsi
Target event_file
menyimpan data yang diterimanya dalam format biner yang tidak dapat dibaca manusia. Fungsi sys.fn_xe_file_target_read_file memungkinkan Anda mewakili konten xel
file sebagai set baris relasional.
Untuk SQL Server 2016 dan versi yang lebih baru, gunakan pernyataan yang SELECT
mirip dengan contoh berikut.
SELECT f.*
--,CAST(f.event_data AS XML) AS [Event-Data-Cast-To-XML] -- Optional
FROM sys.fn_xe_file_target_read_file(
'C:\temp\locks_acq_rel_eventfile_22-*.xel', NULL, NULL, NULL) AS f;
Untuk SQL Server 2014, gunakan pernyataan yang SELECT
mirip dengan contoh berikut. Setelah SQL Server 2014, xem
file tidak lagi digunakan.
SELECT f.*
--,CAST(f.event_data AS XML) AS [Event-Data-Cast-To-XML] -- Optional
FROM sys.fn_xe_file_target_read_file(
'C:\temp\locks_acq_rel_eventfile_22-*.xel', 'C:\temp\metafile.xem', NULL, NULL) AS f;
Dalam kedua contoh ini, *
kartubebas digunakan untuk membaca semua xel
file yang dimulai dengan awalan yang ditentukan.
Di Azure SQL Database, Anda dapat memanggil sys.fn_xe_file_target_read_file()
fungsi setelah membuat kredensial cakupan database yang berisi token SAS dengan Read
izin dan List
pada kontainer dengan xel
blob:
/*
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;
/*
(Re-)create a database scoped credential.
The name of the credential must match the URI of the blob container.
*/
IF EXISTS (
SELECT *
FROM sys.database_credentials
WHERE name = 'https://exampleaccount4xe.blob.core.windows.net/extended-events-container'
)
DROP DATABASE SCOPED CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container];
/*
The secret is the SAS token for the container. The Read and List permissions are set.
*/
CREATE DATABASE SCOPED CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sp=rl&st=2023-10-09T22:12:54Z&se=2023-10-10T06:12:54Z&spr=https&sv=2022-11-02&sr=c&sig=REDACTED';
/*
Return event session data
*/
SELECT f.*
--,CAST(f.event_data AS XML) AS [Event-Data-Cast-To-XML] -- Optional
FROM sys.fn_xe_file_target_read_file('https://exampleaccount4xe.blob.core.windows.net/extended-events-container/event-session-1', DEFAULT, DEFAULT, DEFAULT) AS f;
Di Azure SQL Managed Instance, Anda dapat memanggil sys.fn_xe_file_target_read_file()
fungsi setelah membuat kredensial server yang berisi token SAS dengan Read
izin dan List
pada kontainer dengan xel
blob:
IF NOT EXISTS (
SELECT 1
FROM sys.symmetric_keys
WHERE name = '##MS_DatabaseMasterKey##'
)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'REDACTED';
/*
(Re-)create a database scoped credential.
The name of the credential must match the URI of the blob container.
*/
IF EXISTS (
SELECT *
FROM sys.credentials
WHERE name = 'https://exampleaccount4xe.blob.core.windows.net/extended-events-container'
)
DROP CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container];
/*
The secret is the SAS token for the container. The Read and List permissions are set.
*/
CREATE CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sp=rl&st=2023-10-09T22:12:54Z&se=2023-10-10T06:12:54Z&spr=https&sv=2022-11-02&sr=c&sig=REDACTED';
/*
Return event session data
*/
SELECT f.*
--,CAST(f.event_data AS XML) AS [Event-Data-Cast-To-XML] -- Optional
FROM sys.fn_xe_file_target_read_file('https://exampleaccount4xe.blob.core.windows.net/extended-events-container/event-session-1', DEFAULT, DEFAULT, DEFAULT) AS f;
Tip
Jika Anda menentukan awalan nama blob alih-alih nama blob lengkap dalam argumen sys.fn_xe_file_target_read_file()
pertama , fungsi akan mengembalikan data dari semua blob dalam kontainer yang cocok dengan awalan. Ini memungkinkan Anda mengambil data dari semua file rollover dari sesi peristiwa tertentu tanpa menggunakan *
wildcard, yang tidak didukung oleh Azure Storage.
Contoh Azure SQL sebelumnya menghilangkan xel
ekstensi untuk membaca semua file rollover untuk sesi bernama event-session-1
.
Data yang disimpan dalam target event_file
Ini adalah contoh data yang dikembalikan dari sys.fn_xe_file_target_read_file
di SQL Server 2016 (13.x) dan versi yang lebih baru.
module_guid package_guid object_name event_data file_name file_offset
----------- ------------ ----------- ---------- --------- -----------
D5149520-6282-11DE-8A39-0800200C9A66 03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2 lock_acquired <event name="lock_acquired" package="sqlserver" timestamp="2016-08-07T20:13:35.827Z"><action name="transaction_id" package="sqlserver"><value>39194</value></action><action name="sql_text" package="sqlserver"><value><![CDATA[ select top 1 * from dbo.T_Target; ]]></value></action></event> C:\temp\locks_acq_rel_eventfile_22-_0_131150744126230000.xel 11776
D5149520-6282-11DE-8A39-0800200C9A66 03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2 lock_released <event name="lock_released" package="sqlserver" timestamp="2016-08-07T20:13:35.832Z"><action name="transaction_id" package="sqlserver"><value>39194</value></action><action name="sql_text" package="sqlserver"><value><![CDATA[ select top 1 * from dbo.T_Target; ]]></value></action></event> C:\temp\locks_acq_rel_eventfile_22-_0_131150744126230000.xel 11776
target histogram
Target histogram
dapat:
- Menghitung kemunculan untuk beberapa item secara terpisah
- Hitung kemunculan berbagai jenis item:
- Bidang acara
- Tindakan
histogram
Target memproses data yang diterimanya secara sinkron.
Parameter source_type
adalah kunci untuk mengontrol target histogram:
source_type=0
: kumpulkan data untuk bidang peristiwa.source_type=1
: kumpulkan data untuk tindakan. Ini adalah default.
Default slots
parameter adalah 256. Jika Anda menetapkan nilai lain, nilai dibulatkan ke atas ke daya 2 berikutnya. Misalnya, slot=59 akan dibulatkan hingga 64. Jumlah maksimum slot histogram untuk histogram
target adalah 16384.
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 mungkin terjadi jika tabrakan hash terjadi saat menetapkan peristiwa 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 menyiapkan sesi Extended Events, menggunakan
histogram
sebagai target dan pengelompokan menurutobject_id
, untuk mengumpulkan eksekusi prosedur tersimpan. - Anda menjalankan Prosedur Tersimpan A. Kemudian, Anda menjalankan Prosedur Tersimpan B.
Jika fungsi hash mengembalikan nilai yang sama untuk object_id
kedua prosedur tersimpan, histogram menunjukkan Prosedur Tersimpan A yang dijalankan dua kali, dan Prosedur Tersimpan 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.
Target histogram dengan tindakan
Dalam klausulnya ADD TARGET ... (SET ...)
, pernyataan berikut CREATE EVENT SESSION
menentukan penetapan source_type=1
parameter target . Ini berarti bahwa target histogram melacak tindakan.
Dalam contoh saat ini, ADD EVENT ... (ACTION ...)
klausul hanya menawarkan satu tindakan untuk dipilih, yaitu sqlos.system_thread_id
. ADD TARGET ... (SET ...)
Dalam klausa, kita melihat penugasan source=N'sqlos.system_thread_id'
.
Catatan
Tidak dimungkinkan untuk menambahkan lebih dari satu target dengan jenis yang sama per sesi peristiwa. Ini termasuk histogram
target. Anda juga tidak dapat memiliki lebih dari satu sumber (bidang tindakan/peristiwa) per histogram
target. Oleh karena itu, sesi peristiwa baru diperlukan untuk melacak tindakan tambahan atau bidang peristiwa dalam target terpisah histogram
.
CREATE EVENT SESSION [histogram_lockacquired]
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
);
Data berikut diambil. Nilai dalam value
kolom adalah system_thread_id
nilai. Misalnya, total 236 kunci diambil di bawah utas 6540.
value count
----- -----
6540 236
9308 91
9668 74
10144 49
5244 44
2396 28
SELECT untuk menemukan tindakan yang tersedia
Pernyataan C.3 SELECT
dapat menemukan tindakan yang tersedia sistem untuk Anda tentukan dalam CREATE EVENT SESSION
pernyataan. WHERE
Dalam klausa, Anda akan terlebih dahulu mengedit o.name LIKE
filter agar sesuai dengan tindakan yang Anda minati.
Selanjutnya adalah kumpulan baris sampel yang dikembalikan oleh C.3 SELECT
. Tindakan system_thread_id
terlihat di baris kedua.
Package-Name Action-Name Action-Description
------------ ----------- ------------------
package0 collect_current_thread_id Collect the current Windows thread ID
sqlos system_thread_id Collect current system thread ID
sqlserver create_dump_all_threads Create mini dump including all threads
sqlserver create_dump_single_thread Create mini dump for the current thread
Target histogram dengan bidang peristiwa
Contoh berikut menetapkan source_type=0
. Nilai yang ditetapkan untuk source
adalah bidang peristiwa.
CREATE EVENT SESSION [histogram_checkpoint_dbid]
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
ADD TARGET package0.histogram
(
SET
filtering_event_name = N'sqlserver.checkpoint_begin',
source = N'database_id',
source_type = 0
);
Data berikut diambil oleh histogram
target. Data menunjukkan bahwa database dengan ID 5 mengalami 7 checkpoint_begin
peristiwa.
value count
----- -----
5 7
7 4
6 3
SELECT untuk menemukan bidang yang tersedia pada peristiwa yang Anda pilih
Pernyataan C.4 SELECT
memperlihatkan bidang peristiwa yang dapat Anda pilih. Anda akan terlebih dahulu mengedit o.name LIKE
filter untuk menjadi nama peristiwa yang Anda pilih.
Himpunan baris berikut dikembalikan oleh C.4 SELECT
. Himpunan baris menunjukkan bahwa database_id
adalah satu-satunya bidang pada checkpoint_begin
peristiwa yang dapat menyediakan nilai untuk histogram
target.
Package-Name Event-Name Field-Name Field-Description
------------ ---------- ---------- -----------------
sqlserver checkpoint_begin database_id NULL
sqlserver checkpoint_end database_id NULL
target pair_matching
Target pair_matching
memungkinkan Anda mendeteksi peristiwa mulai yang terjadi tanpa peristiwa akhir yang sesuai. Misalnya, mungkin masalah ketika lock_acquired
peristiwa terjadi tetapi tidak ada peristiwa yang lock_released
cocok mengikuti tepat waktu.
Sistem tidak secara otomatis cocok dengan peristiwa mulai dan berakhir. Sebagai gantinya, Anda menjelaskan pencocokan dengan sistem dalam pernyataan Anda CREATE EVENT SESSION
. Ketika peristiwa awal dan akhir dicocokkan, pasangan dibuang untuk fokus pada peristiwa mulai yang tidak cocok.
Menemukan bidang yang cocok untuk pasangan peristiwa awal dan akhir
Dengan menggunakan C.4 SELECT, kita melihat di kumpulan baris berikut ada sekitar 16 bidang untuk peristiwa tersebut lock_acquired
. Himpunan baris yang ditampilkan di sini telah dibagi secara manual untuk menunjukkan bidang mana yang cocok dengan contoh kami. Untuk beberapa bidang seperti duration
, mencoba mencocokkan tidak ada artinya.
Package-Name Event-Name Field-Name Field-Description
------------ ---------- ---------- -----------------
sqlserver lock_acquired database_name NULL
sqlserver lock_acquired mode NULL
sqlserver lock_acquired resource_0 The ID of the locked object, when lock_resource_type is OBJECT.
sqlserver lock_acquired resource_1 NULL
sqlserver lock_acquired resource_2 The ID of the lock partition, when lock_resource_type is OBJECT, and resource_1 is 0.
sqlserver lock_acquired transaction_id NULL
sqlserver lock_acquired associated_object_id The ID of the object that requested the lock that was acquired.
sqlserver lock_acquired database_id NULL
sqlserver lock_acquired duration The time (in microseconds) between when the lock was requested and when it was canceled.
sqlserver lock_acquired lockspace_nest_id NULL
sqlserver lock_acquired lockspace_sub_id NULL
sqlserver lock_acquired lockspace_workspace_id NULL
sqlserver lock_acquired object_id The ID of the locked object, when lock_resource_type is OBJECT. For other lock resource types it will be 0
sqlserver lock_acquired owner_type NULL
sqlserver lock_acquired resource_description The description of the lock resource. The description depends on the type of lock. This is the same value as the resource_description column in the sys.dm_tran_locks view.
sqlserver lock_acquired resource_type NULL
Contoh target pair_matching
Pernyataan berikut CREATE EVENT SESSION
menentukan dua peristiwa, dan dua target. pair_matching
Target menentukan dua set bidang untuk mencocokkan peristiwa menjadi pasangan. Urutan bidang yang dibatasi koma yang ditetapkan dan begin_matching_columns
end_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.
Untuk mempersempit hasilnya, pertama-tama kita pilih dari sys.objects
untuk menemukan object_id
tabel pengujian kita. Kami menambahkan filter untuk satu ID objek tersebut ADD EVENT ... (WHERE ...)
dalam klausa.
CREATE EVENT SESSION [pair_matching_lock_a_r_33]
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
SET
collect_database_name = 1,
collect_resource_description = 1
ACTION (sqlserver.transaction_id)
WHERE
(
[database_name] = 'InMemTest2'
AND
[object_id] = 370100359
)
),
ADD EVENT sqlserver.lock_released
(
SET
collect_database_name = 1,
collect_resource_description = 1
ACTION (sqlserver.transaction_id)
WHERE
(
[database_name] = 'InMemTest2'
AND
[object_id] = 370100359
)
)
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 menguji sesi peristiwa, kami sengaja mencegah dua kunci yang diperoleh dilepaskan. Kami melakukan ini dengan langkah-langkah T-SQL berikut:
BEGIN TRANSACTION
.UPDATE MyTable...
.- Sengaja tidak mengeluarkan
COMMIT TRANSACTION
, sampai setelah kami memeriksa target. - Kemudian setelah pengujian, kami mengeluarkan
COMMIT TRANSACTION
.
Target sederhana event_counter
menyediakan baris output berikut. Karena 52-50=2, output menyiratkan bahwa kita melihat 2 peristiwa lock_acquired yang tidak berpasangan saat kita memeriksa output dari target pencocokan pasangan.
package_name event_name count
------------ ---------- -----
sqlserver lock_acquired 52
sqlserver lock_released 50
Target pair_matching
memberikan output berikut. Seperti yang disarankan event_counter
oleh output, kita memang melihat dua lock_acquired
baris. Fakta bahwa kita melihat baris-baris ini sama sekali berarti kedua lock_acquired
peristiwa ini tidak berpasangan.
package_name event_name timestamp database_name duration mode object_id owner_type resource_0 resource_1 resource_2 resource_description resource_type transaction_id
------------ ---------- --------- ------------- -------- ---- --------- ---------- ---------- ---------- ---------- -------------------- ------------- --------------
sqlserver lock_acquired 2016-08-05 12:45:47.9980000 InMemTest2 0 S 370100359 Transaction 370100359 3 0 [INDEX_OPERATION] OBJECT 34126
sqlserver lock_acquired 2016-08-05 12:45:47.9980000 InMemTest2 0 IX 370100359 Transaction 370100359 0 0 OBJECT 34126
Baris untuk peristiwa yang belum dipasang lock_acquired
dapat menyertakan teks T-SQL yang disediakan oleh sqlserver.sql_text
tindakan. Ini menangkap kueri yang memperoleh kunci.
target ring_buffer
Target ring_buffer
berguna untuk pengumpulan peristiwa yang cepat dan sederhana dalam memori saja. Saat Anda menghentikan sesi peristiwa, output yang disimpan akan dibuang.
Di bagian ini, kami juga menunjukkan bagaimana Anda dapat menggunakan XQuery untuk mengonversi representasi XML dari konten buffer cincin menjadi kumpulan baris relasional yang lebih mudah dibaca.
Tip
Saat menambahkan ring_buffer
target, atur parameternya MAX_MEMORY
ke 1024 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 dan Azure SQL Managed Instance.
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">
BUAT SESI PERISTIWA dengan target ring_buffer
Berikut adalah contoh membuat sesi peristiwa dengan ring_buffer
target. Dalam contoh ini, MAX_MEMORY
parameter muncul dua kali: sekali untuk mengatur ring_buffer
memori target ke 1024 KB, dan sekali untuk mengatur memori buffer sesi peristiwa menjadi 2 MB.
CREATE EVENT SESSION [ring_buffer_lock_acquired_4]
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
SET collect_resource_description=(1)
ACTION(sqlserver.database_name)
WHERE
(
[object_id]=(370100359) -- ID of MyTable
AND
sqlserver.database_name='InMemTest2'
)
)
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 98,
MAX_MEMORY = 1024
)
WITH
(
MAX_MEMORY = 2 MB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Output XML diterima untuk lock_acquired oleh target ring_buffer
Saat diambil oleh SELECT
pernyataan, konten buffer cincin disajikan sebagai dokumen XML. Contoh ditunjukkan berikutnya. Namun, untuk brevity, semua kecuali dua <event>
elemen telah dihapus. Selanjutnya, dalam setiap <event>
, beberapa <data>
elemen juga telah dihapus.
<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="6" eventCount="6" droppedCount="0" memoryUsed="1032">
<event name="lock_acquired" package="sqlserver" timestamp="2016-08-05T23:59:53.987Z">
<data name="mode">
<type name="lock_mode" package="sqlserver"></type>
<value>1</value>
<text><![CDATA[SCH_S]]></text>
</data>
<data name="transaction_id">
<type name="int64" package="package0"></type>
<value>111030</value>
</data>
<data name="database_id">
<type name="uint32" package="package0"></type>
<value>5</value>
</data>
<data name="resource_0">
<type name="uint32" package="package0"></type>
<value>370100359</value>
</data>
<data name="resource_1">
<type name="uint32" package="package0"></type>
<value>0</value>
</data>
<data name="resource_2">
<type name="uint32" package="package0"></type>
<value>0</value>
</data>
<data name="database_name">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[]]></value>
</data>
<action name="database_name" package="sqlserver">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[InMemTest2]]></value>
</action>
</event>
<event name="lock_acquired" package="sqlserver" timestamp="2016-08-05T23:59:56.012Z">
<data name="mode">
<type name="lock_mode" package="sqlserver"></type>
<value>1</value>
<text><![CDATA[SCH_S]]></text>
</data>
<data name="transaction_id">
<type name="int64" package="package0"></type>
<value>111039</value>
</data>
<data name="database_id">
<type name="uint32" package="package0"></type>
<value>5</value>
</data>
<data name="resource_0">
<type name="uint32" package="package0"></type>
<value>370100359</value>
</data>
<data name="resource_1">
<type name="uint32" package="package0"></type>
<value>0</value>
</data>
<data name="resource_2">
<type name="uint32" package="package0"></type>
<value>0</value>
</data>
<data name="database_name">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[]]></value>
</data>
<action name="database_name" package="sqlserver">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[InMemTest2]]></value>
</action>
</event>
</RingBufferTarget>
Untuk melihat XML sebelumnya, Anda bisa mengeluarkan hal berikut SELECT
saat sesi peristiwa aktif. Data XML diambil dari tampilan sys.dm_xe_session_targets
sistem .
SELECT CAST(LocksAcquired.TargetXml AS XML) AS RBufXml
INTO #XmlAsTable
FROM (
SELECT CAST(t.target_data AS XML) AS TargetXml
FROM sys.dm_xe_session_targets AS t
INNER JOIN sys.dm_xe_sessions AS s
ON s.address = t.event_session_address
WHERE t.target_name = 'ring_buffer'
AND s.name = 'ring_buffer_lock_acquired_4'
) AS LocksAcquired;
SELECT *
FROM #XmlAsTable;
XQuery untuk melihat XML sebagai set baris
Untuk melihat XML sebelumnya sebagai kumpulan baris relasional, lanjutkan dari pernyataan sebelumnya SELECT
dengan mengeluarkan T-SQL berikut. Baris yang dikomentari menjelaskan setiap penggunaan XQuery.
SELECT
-- (A)
ObjectLocks.value('(@timestamp)[1]', 'datetime') AS [OccurredDtTm],
-- (B)
ObjectLocks.value('(data[@name="mode"]/text)[1]', 'nvarchar(32)') AS [Mode],
-- (C)
ObjectLocks.value('(data[@name="transaction_id"]/value)[1]', 'bigint') AS [TxnId],
-- (D)
ObjectLocks.value('(action[@name="database_name" and @package="sqlserver"]/value)[1]', 'nvarchar(128)') AS [DatabaseName]
FROM #XmlAsTable
CROSS APPLY
-- (E)
TargetDateAsXml.nodes('/RingBufferTarget/event[@name="lock_acquired"]') AS T(ObjectLocks);
Catatan XQuery dari SELECT sebelumnya
(A)
- tanda waktu= nilai atribut, pada
<event>
elemen. - Konstruksi
'(...)[1]'
memastikan hanya satu nilai yang dikembalikan per perulangan, seperti batasan yang diperlukan dari.value()
metode XQuery dari variabel dan kolom jenis data XML.
(B)
<text>
nilai dalam elemen, dalam<data>
elemen , yang memiliki nama = atribut yang sama denganmode
.
(C)
<value>
elemen nilai dalam, dalam<data>
elemen, yang memiliki nama= atribut sama dengantransaction_id
.
(D)
<event>
berisi<action>
.<action>
having name= attribute equal todatabase_name
, and package= attribute equal tosqlserver
(notpackage0
), get the inner value of<value>
element.
(E)
CROSS APPLY
menyebabkan pemrosesan diulang untuk setiap elemen individu<event>
, yang memiliki atributnyaname
sama denganlock_acquired
.- Ini berlaku untuk XML yang dikembalikan oleh klausa sebelumnya
FROM
.
Output dari XQuery SELECT
Selanjutnya adalah set baris yang dihasilkan oleh T-SQL sebelumnya, yang mencakup XQuery.
OccurredDtTm Mode DatabaseName
------------ ---- ------------
2016-08-05 23:59:53.987 SCH_S InMemTest2
2016-08-05 23:59:56.013 SCH_S InMemTest2
target event_stream
Target event_stream
hanya dapat digunakan dalam program .NET yang ditulis dalam bahasa seperti C#. C# dan pengembang .NET lainnya dapat mengakses aliran peristiwa melalui kelas .NET Framework di Microsoft.SqlServer.XEvents.Linq
namespace layanan. Target ini tidak dapat digunakan dalam T-SQL.
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.