Target untuk Kejadian yang Diperluas

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure 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:

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:

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 dalam ADD TARGET klausa. Ekstensi file harus xel.
  • 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 menurut object_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=1parameter 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.3SELECT 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.4SELECT 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_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.

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:

  1. BEGIN TRANSACTION.
  2. UPDATE MyTable....
  3. Sengaja tidak mengeluarkan COMMIT TRANSACTION, sampai setelah kami memeriksa target.
  4. 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_targetssistem .

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 dengan mode.

(C)

  • <value> elemen nilai dalam, dalam <data> elemen, yang memiliki nama= atribut sama dengan transaction_id.

(D)

  • <event> berisi <action>.
  • <action> having name= attribute equal to database_name, and package= attribute equal to sqlserver (not package0), get the inner value of <value> element.

(E)

  • CROSS APPLY menyebabkan pemrosesan diulang untuk setiap elemen individu <event> , yang memiliki atributnya name sama dengan lock_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.

Namespace XEvent