Megosztás a következőn keresztül:


Meglévő SQL Trace-szkript konvertálása kiterjesztett esemény munkamenetté

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ha rendelkezik egy meglévő SQL Trace-szkripttel, amelyet bővített események munkamenetté szeretne konvertálni, a jelen témakörben ismertetett eljárásokkal létrehozhat egy egyenértékű Kiterjesztett események munkamenetet. A trace_xe_action_map és trace_xe_event_map rendszertáblákban található információk használatával összegyűjtheti azokat az információkat, amelyeket az átalakításhoz el kell végeznie.

A lépések a következők:

  1. Futtassa a meglévő szkriptet egy SQL Trace-munkamenet létrehozásához, majd szerezze be a nyomkövetés azonosítóját.

  2. Futtasson egy lekérdezést, amely a fn_trace_geteventinfo függvénnyel megkeresi az egyes SQL Trace-eseményosztályok és a hozzá tartozó oszlopok megfelelő Kiterjesztett események eseményeit és műveleteit.

  3. A fn_trace_getfilterinfo függvénnyel listázhatja a szűrőket és az ezzel egyenértékű kiterjesztett esemény műveleteket.

  4. Hozzon létre manuálisan egy Kiterjesztett események munkamenetet az egyenértékű Kiterjesztett események események, műveletek és predikátumok (szűrők) használatával.

A nyomkövetési azonosító beszerzése

  1. Nyissa meg az SQL Trace szkriptet a Lekérdezésszerkesztőben, majd hajtsa végre a szkriptet a nyomkövetési munkamenet létrehozásához. Vegye figyelembe, hogy a nyomkövetési munkamenetnek nem kell futnia az eljárás elvégzéséhez.

  2. Szerezze be a nyomkövetési azonosítót. Ehhez használja a következő lekérdezést:

    SELECT * FROM sys.traces;  
    GO  
    

    Megjegyzés:

    Az 1. nyomkövetési azonosító általában az alapértelmezett nyomkövetést jelzi.

A kiterjesztett események megfelelőinek meghatározása

  1. A kiterjesztett események egyenértékű eseményeinek és műveleteinek meghatározásához futtassa a következő lekérdezést, amelyben a trace_id az előző eljárásban beszerzett nyomkövetési azonosító értékére van állítva.

    Megjegyzés:

    Ebben a példában a rendszer az alapértelmezett nyomkövetés (1) nyomkövetési azonosítóját használja.

    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;  
    

    A rendszer visszaadja a kiterjesztett események megfelelő eseményazonosítóját, csomagnevét, eseménynevét, oszlopazonosítóját és műveletnevét. Ezt a kimenetet a jelen témakör későbbi, "A kiterjesztett események munkamenetének létrehozása" című eljárásában fogja használni.

    Bizonyos esetekben a szűrt oszlop egy esemény adatmezőjére van leképezve, amely alapértelmezés szerint szerepel a Kiterjesztett események eseményben. Ezért a "Extended_Events_action_name" oszlop NULL értékű lesz. Ha ez történik, az alábbiakat kell tennie annak meghatározásához, hogy melyik adatmező felel meg a szűrt oszlopnak:

    1. A NULL értéket visszaadó műveleteknél határozza meg, hogy a szkript mely SQL Trace-eseményosztályai tartalmazzák a szűrt oszlopot.

      Előfordulhat például, hogy az SP:StmtCompleted eseményosztályt használta, és adott meg egy szűrőt az Időtartam nyomkövetési oszlop nevére (SQL Trace eseményosztály azonosítója 45, és az SQL Trace oszlopazonosítója 13). Ebben az esetben a művelet neve NULL értékként jelenik meg a lekérdezés eredményei között.

    2. Az előző lépésben azonosított SQL Trace-eseményosztályok esetében keresse meg a kiterjesztett események megfelelő eseménynevét. (Ha nem biztos az ezzel egyenértékű eseménynévben, használja a témakör lekérdezését Az SQL Trace eseményosztályokkal egyenértékű kiterjesztett események megtekintése című témakörben.)

    3. Az alábbi lekérdezés segítségével azonosíthatja az előző lépésben azonosított eseményekhez használandó megfelelő adatmezőket. A lekérdezés a Kiterjesztett események adatmezőket jeleníti meg a "event_field" oszlopban. A lekérdezésben cserélje le <a event_name> az előző lépésben megadott esemény nevére.

      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>';  
      

      Az SP:StmtCompleted eseményosztály például leképezi a sp_statement_completed Bővített események eseményt. Ha a lekérdezésben sp_statement_completed ad meg eseménynévként, a "event_field" oszlop az eseményhez alapértelmezés szerint belefoglalt mezőket jeleníti meg. A mezőket tekintve láthatja, hogy van egy "duration" mező. Ha a szűrőt a kiterjesztett események megfelelő munkamenetében szeretné létrehozni, egy predikátumot adna hozzá, például "WHERE duration > 0". Példaként tekintse meg a jelen témakör "A bővített események munkamenetének létrehozása" című szakaszát.

A Bővített események munkamenetének létrehozása

A Lekérdezésszerkesztővel hozza létre a Bővített események munkamenetet, és írja a kimenetet egy fájl céljára. Az alábbi lépések egyetlen lekérdezést írnak le, és magyarázatokkal mutatják be, hogyan hozhatja létre a lekérdezést. A teljes lekérdezési példáért tekintse meg a témakör "Példa" szakaszát.

  1. Adjon hozzá utasításokat az esemény-munkamenet létrehozásához, és cserélje le a session_name a Kiterjesztett események munkamenethez használni kívánt névre.

    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. Adja hozzá a "Kiterjesztett események megfelelőinek meghatározása" eljárás kimeneteként visszaadott kiterjesztett események eseményeit és műveleteit, majd adja hozzá a "Szkriptben használt szűrők meghatározása" eljárásban azonosított predikátumokat (szűrőket).

    Az alábbi példa egy SQL Trace-szkriptet használ, amely tartalmazza az SQL:StmtStarting és az SP:StmtCompleted eseményosztályokat, valamint a munkamenet-azonosítóra és az időtartamra vonatkozó szűrőket. A "Kiterjesztett események megfelelőinek meghatározása" eljárás lekérdezésének mintakimenete a következő eredményhalmazt adja vissza:

    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  
    

    Ha ezt kiterjesztett eseményeknek megfelelővé szeretné alakítani, a sqlserver.sp_statement_starting és a sqlserver.sp_statement_completed események hozzáadódnak a műveletek listájával. A predikátum-utasítások WHERE záradékként szerepelnek.

    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. Adja hozzá az aszinkron fájlcélt, és cserélje le a fájl elérési útját arra a helyre, ahová menteni szeretné a kimenetet. A fájl céljának megadásakor tartalmaznia kell egy naplófájlt és egy metaadatfájl elérési útját.

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

Az eredmények megtekintése

  1. A kimenetet a sys.fn_xe_file_target_read_file függvénnyel tekintheti meg. Ehhez futtassa a következő lekérdezést, és cserélje le a fájl elérési útját a megadott elérési utakra:

    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);  
    
    

    Megjegyzés:

    Az eseményadatok XML-fájlként való megadása nem kötelező.

    A sys.fn_xe_file_target_read_file függvényről további információt a sys.fn_xe_file_target_read_file (Transact-SQL) című témakörben talál.

    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');  
    

Example

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');  

Lásd még:

Az SQL Trace-eseményosztályokkal egyenértékű kiterjesztett események megtekintése