Mengonversi Skrip Pelacakan SQL yang Ada ke Sesi Kejadian yang Diperluas

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Jika Anda memiliki skrip SQL Trace yang ingin Anda konversi ke sesi Extended Events, Anda dapat menggunakan prosedur dalam topik ini untuk membuat sesi Extended Events yang setara. Dengan menggunakan informasi dalam tabel sistem trace_xe_action_map dan trace_xe_event_map, Anda dapat mengumpulkan informasi yang harus Anda lakukan konversi.

Langkah-langkahnya termasuk yang berikut ini:

  1. Jalankan skrip yang ada untuk membuat sesi SQL Trace, lalu dapatkan ID pelacakan.

  2. Jalankan kueri yang menggunakan fungsi fn_trace_geteventinfo untuk menemukan peristiwa dan tindakan Extended Events yang setara untuk setiap kelas peristiwa SQL Trace dan kolom terkait.

  3. Gunakan fungsi fn_trace_getfilterinfo untuk mencantumkan filter dan tindakan Extended Events yang setara untuk digunakan.

  4. Buat sesi Extended Events secara manual, menggunakan peristiwa, tindakan, dan predikat (filter) Yang Diperluas yang setara.

Untuk mendapatkan ID pelacakan

  1. Buka skrip Jejak SQL di Editor Kueri, lalu jalankan skrip untuk membuat sesi pelacakan. Perhatikan bahwa sesi pelacakan tidak perlu berjalan untuk menyelesaikan prosedur ini.

  2. Dapatkan ID pelacakan. Untuk melakukan ini, gunakan kueri berikut:

    SELECT * FROM sys.traces;  
    GO  
    

    Catatan

    TRACE ID 1 biasanya menunjukkan jejak default.

Untuk menentukan persamaan Extended Events

  1. Untuk menentukan peristiwa dan tindakan Extended Events yang setara, jalankan kueri berikut, di mana trace_id diatur ke nilai ID pelacakan yang Anda peroleh di prosedur sebelumnya.

    Catatan

    Dalam contoh ini, ID pelacakan untuk jejak default (1) digunakan.

    USE MASTER;  
    GO  
    DECLARE @trace_id int;  
    SET @trace_id = 1;  
    SELECT DISTINCT el.eventid, em.package_name, em.xe_event_name AS 'event'  
       , el.columnid, ec.xe_action_name AS 'action'  
    FROM (sys.fn_trace_geteventinfo(@trace_id) AS el  
       LEFT OUTER JOIN sys.trace_xe_event_map AS em  
          ON el.eventid = em.trace_event_id)  
    LEFT OUTER JOIN sys.trace_xe_action_map AS ec  
       ON el.columnid = ec.trace_column_id  
    WHERE em.xe_event_name IS NOT NULL AND ec.xe_action_name IS NOT NULL;  
    

    ID peristiwa Extended Events yang setara, nama paket, nama peristiwa, ID kolom, dan nama tindakan dikembalikan. Anda akan menggunakan output ini dalam prosedur "Untuk membuat sesi Acara yang Diperluas" nanti dalam topik ini.

    Dalam beberapa kasus, kolom yang difilter memetakan ke bidang data peristiwa yang disertakan secara default dalam peristiwa Kejadian yang Diperluas. Oleh karena itu, kolom "Extended_Events_action_name" akan menjadi NULL. Jika ini terjadi, Anda harus melakukan hal berikut untuk menentukan bidang data mana yang setara dengan kolom yang difilter:

    1. Untuk tindakan yang mengembalikan NULL, identifikasi kelas peristiwa SQL Trace mana dalam skrip yang berisi kolom yang sedang difilter.

      Misalnya, Anda mungkin telah menggunakan kelas peristiwa SP:StmtCompleted, dan menentukan filter pada nama kolom Jejak durasi (kelas peristiwa SQL Trace ID 45, dan ID kolom SQL Trace 13). Dalam hal ini, nama tindakan akan muncul sebagai NULL dalam hasil kueri.

    2. Untuk setiap kelas peristiwa SQL Trace yang Anda identifikasi di langkah sebelumnya, temukan nama peristiwa Extended Events yang setara. (Jika Anda tidak yakin dengan nama peristiwa yang setara, gunakan kueri dalam topik Lihat Acara yang Diperluas Setara dengan Kelas Peristiwa Pelacakan SQL.)

    3. Gunakan kueri berikut untuk mengidentifikasi bidang data yang benar untuk digunakan untuk peristiwa yang Anda identifikasi di langkah sebelumnya. Kueri memperlihatkan bidang data Extended Events di kolom "event_field". Dalam kueri, ganti <event_name> dengan nama peristiwa yang Anda tentukan di langkah sebelumnya.

      SELECT xp.name package_name, xe.name event_name  
         ,xc.name event_field, xc.description  
      FROM sys.trace_xe_event_map AS em  
      INNER JOIN sys.dm_xe_objects AS xe  
         ON em.xe_event_name = xe.name  
      INNER JOIN sys.dm_xe_packages AS xp  
         ON xe.package_guid = xp.guid AND em.package_name = xp.name  
      INNER JOIN sys.dm_xe_object_columns AS xc  
         ON xe.name = xc.object_name  
      WHERE xe.object_type = 'event' AND xc.column_type <> 'readonly'  
         AND em.xe_event_name = '<event_name>';  
      

      Misalnya, kelas peristiwa SP:StmtCompleted memetakan ke peristiwa sp_statement_completed Extended Events. Jika Anda menentukan sp_statement_completed sebagai nama peristiwa dalam kueri, kolom "event_field" memperlihatkan bidang yang disertakan secara default dengan peristiwa. Melihat bidang, Anda dapat melihat bahwa ada bidang "durasi". Untuk membuat filter dalam sesi Extended Events yang setara, Anda akan menambahkan predikat seperti "WHERE duration > 0". Misalnya, lihat prosedur "Untuk membuat sesi Extended Events" dalam topik ini.

Untuk membuat sesi Extended Events

Gunakan Editor Kueri untuk membuat sesi Kejadian yang Diperluas, dan untuk menulis output ke target file. Langkah-langkah berikut ini menjelaskan satu kueri, dengan penjelasan untuk memperlihatkan kepada Anda cara membuat kueri. Untuk contoh kueri lengkap, lihat bagian "Contoh" dari topik ini.

  1. Tambahkan pernyataan untuk membuat sesi peristiwa, mengganti session_name dengan nama yang ingin Anda gunakan untuk sesi Acara yang Diperluas.

    IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
       DROP EVENT SESSION [Session_Name] ON SERVER;  
    CREATE EVENT SESSION [Session_Name]  
    ON SERVER;  
    
  2. Tambahkan peristiwa dan tindakan Peristiwa yang Diperluas yang dikembalikan sebagai output dalam prosedur "Tentukan Peristiwa yang Diperluas yang setara", dan tambahkan predikat (filter) yang Anda identifikasi dalam prosedur "Untuk menentukan filter yang digunakan dalam skrip".

    Contoh berikut menggunakan skrip SQL Trace yang menyertakan kelas peristiwa SQL:StmtStarting dan SP:StmtCompleted, dengan filter untuk ID sesi dan durasi. Contoh output untuk kueri dalam prosedur "Tentukan Peristiwa yang Diperluas yang setara" mengembalikan tataan hasil berikut:

    Eventid  package_name  event                   columnid  action  
    44       sqlserver     sp_statement_starting   6         nt_username  
    44       sqlserver     sp_statement_starting   9         client_pid  
    44       sqlserver     sp_statement_starting   10        client_app_name  
    44       sqlserver     sp_statement_starting   11        server_principal_name  
    44       sqlserver     sp_statement_starting   12        session_id  
    45       sqlserver     sp_statement_completed  6         nt_username  
    45       sqlserver     sp_statement_completed  9         client_pid  
    45       sqlserver     sp_statement_completed  10        client_app_name  
    45       sqlserver     sp_statement_completed  11        server_principal_name  
    45       sqlserver     sp_statement_completed  12        session_id  
    

    Untuk mengonversi ini ke Acara yang Diperluas yang setara, sqlserver.sp_statement_starting dan peristiwa sqlserver.sp_statement_completed ditambahkan, dengan daftar tindakan. Pernyataan predikat disertakan sebagai klausul WHERE.

    ADD EVENT sqlserver.sp_statement_starting  
       (ACTION  
          (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
          )  
       WHERE sqlserver.session_id = 59   
       ),  
    
    ADD EVENT sqlserver.sp_statement_completed  
       (ACTION  
          (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
          )  
       WHERE sqlserver.session_id = 59 AND duration > 0  
       )  
    
  3. Tambahkan target file asinkron, ganti jalur file dengan lokasi tempat Anda ingin menyimpan output. Saat menentukan target file, Anda harus menyertakan file log dan file jalur file metadata.

    ADD TARGET package0.asynchronous_file_target(  
       SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  
    

Untuk melihat hasilnya

  1. Anda dapat menggunakan fungsi sys.fn_xe_file_target_read_file untuk melihat output. Untuk melakukan ini, jalankan kueri berikut, ganti jalur file dengan jalur yang Anda tentukan:

    SELECT *, CAST(event_data as XML) AS 'event_data_XML'  
    FROM sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel', 'c:\temp\ExtendedEventsStoredProcs*.xem', NULL, NULL);  
    
    

    Catatan

    Mentransmisian data peristiwa karena XML bersifat opsional.

    Untuk informasi selengkapnya tentang fungsi sys.fn_xe_file_target_read_file, lihat sys.fn_xe_file_target_read_file (Transact-SQL).

    IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
       DROP EVENT SESSION [session_name] ON SERVER;  
    CREATE EVENT SESSION [session_name]  
    ON SERVER  
    
    ADD EVENT sqlserver.sp_statement_starting  
       (ACTION  
       (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
       )  
       WHERE sqlserver.session_id = 59   
       ),  
    
    ADD EVENT sqlserver.sp_statement_completed  
       (ACTION  
       (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
       )  
       WHERE sqlserver.session_id = 59 AND duration > 0  
       );  
    
    ADD TARGET package0.asynchronous_file_target  
       (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  
    

Contoh

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
   DROP EVENT SESSION [session_name] ON SERVER;  
CREATE EVENT SESSION [session_name]  
ON SERVER  
  
ADD EVENT sqlserver.sp_statement_starting  
   (ACTION  
   (  
      sqlserver.nt_username,  
      sqlserver.client_pid,  
      sqlserver.client_app_name,  
      sqlserver.server_principal_name,  
      sqlserver.session_id  
   )  
   WHERE sqlserver.session_id = 59   
   ),  
  
ADD EVENT sqlserver.sp_statement_completed  
   (ACTION  
   (  
      sqlserver.nt_username,  
      sqlserver.client_pid,  
      sqlserver.client_app_name,  
      sqlserver.server_principal_name,  
      sqlserver.session_id  
   )  
   WHERE sqlserver.session_id = 59 AND duration > 0  
   )  
  
ADD TARGET package0.asynchronous_file_target  
   (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  

Lihat Juga

Melihat Acara yang Diperluas Setara dengan Kelas Peristiwa Pelacakan SQL