Sdílet prostřednictvím


Převod existujícího skriptu trasování SQL na relaci rozšířených událostí

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLDatabáze SQL v Microsoft Fabric

Pokud máte existující skript trasování SQL, který chcete převést na relaci rozšířených událostí, můžete pomocí postupů v tomto tématu vytvořit ekvivalentní relaci rozšířených událostí. Pomocí informací v systémových tabulkách trace_xe_action_map a trace_xe_event_map můžete shromáždit informace, které musíte k převodu provést.

Mezi tyto kroky patří:

  1. Spuštěním existujícího skriptu vytvořte relaci trasování SQL a poté získejte ID trasování.

  2. Spusťte dotaz, který používá funkci fn_trace_geteventinfo k vyhledání ekvivalentních událostí rozšířených událostí a akcí pro každou třídu událostí trasování SQL a příslušné sloupce.

  3. Pomocí funkce fn_trace_getfilterinfo vypíšete filtry a ekvivalentní akce rozšířených událostí, které se mají použít.

  4. Ručně vytvořte relaci rozšířených událostí s použitím ekvivalentních událostí, akcí a predikátů (filtrů).

Chcete-li získat ID trasování

  1. Otevřete skript trasování SQL v Editoru dotazů a potom spusťte skript pro vytvoření relace trasování. Mějte na paměti, že k dokončení tohoto postupu není nutné mít spuštěnou sledovací relaci.

  2. Získejte ID sledování. K tomu použijte následující dotaz:

    SELECT * FROM sys.traces;  
    GO  
    

    Poznámka:

    ID trasování 1 obvykle označuje výchozí trasování.

Určení ekvivalentů rozšířených událostí

  1. Chcete-li určit ekvivalentní události a akce rozšířených událostí, spusťte následující dotaz, kde trace_id je nastavena na hodnotu ID trasování, které jste získali v předchozím postupu.

    Poznámka:

    V tomto příkladu se používá ID trasování pro výchozí trasování (1).

    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;  
    

    Vrátí se ekvivalentní ID události Extended Events, název balíčku, název události, ID sloupce a název akce. Tento výstup použijete v postupu "Vytvoření relace rozšířených událostí" dále v tomto tématu.

    V některých případech se filtrovaný sloupec mapuje na datové pole události, které je ve výchozím nastavení součástí události Extended Events. Proto sloupec "Extended_Events_action_name" bude null. Pokud k tomu dojde, musíte provést následující kroky, abyste zjistili, které datové pole odpovídá filtrovanému sloupci:

    1. U akcí, které vracejí hodnotu NULL, určete, které třídy událostí trasování SQL ve skriptu obsahují sloupec, který se filtruje.

      Mohli jste například použít třídu událostí SP:StmtCompleted a zadali jste filtr pro název sloupce trasování Doba trvání (třída událostí trasování SQL ID 45 a sloupec trasování SQL ID 13). V tomto případě se název akce ve výsledcích dotazu zobrazí jako NULL.

    2. Pro každou třídu událostí trasování SQL, kterou jste identifikovali v předchozím kroku, vyhledejte ekvivalentní název události Extended Events. (Pokud si nejste jistí ekvivalentním názvem události, použijte dotaz v tématu Zobrazení ekvivalentů rozšířených událostí ke třídám událostí trasování SQL.)

    3. Pomocí následujícího dotazu identifikujte správná datová pole, která se mají použít pro události, které jste identifikovali v předchozím kroku. Dotaz zobrazuje datová pole Rozšířených událostí ve sloupci "event_field". V dotazu nahraďte <event_name> názvem události, kterou jste zadali v předchozím kroku.

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

      Například událost třídy SP:StmtCompleted odpovídá události Extended Events sp_statement_completed. Pokud v dotazu zadáte sp_statement_completed jako název události, zobrazí se ve sloupci "event_field" pole, která jsou ve výchozím nastavení součástí události. Když se podíváte na pole, uvidíte, že existuje pole 'doba trvání'. Chcete-li vytvořit filtr v ekvivalentní relaci rozšířených událostí, přidejte predikát, například "WHERE duration > 0". Příklad najdete v postupu "Vytvoření relace rozšířených událostí" v této části.

Vytvořit relaci rozšířených událostí

Pomocí Editoru dotazů vytvořte relaci událostí a zapište výstup do cílového souboru. Následující kroky popisují jeden dotaz s vysvětlením, které vám ukážou, jak vytvořit dotaz. Úplný příklad dotazu najdete v části Příklad tohoto tématu.

  1. Přidejte příkazy pro vytvoření relace události a nahraďte session_name názvem, který chcete použít pro relaci rozšířených událostí.

    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. Přidejte události a akce rozšířené události, které byly vráceny jako výstup v postupu "Určení ekvivalentů rozšířených událostí", a přidejte predikáty (filtry), které jste identifikovali v postupu "Určení filtrů použitých ve skriptu".

    Následující příklad používá skript trasování SQL, který obsahuje třídy událostí SQL:StmtStarting a SP:StmtCompleted s filtry pro ID relace a dobu trvání. Ukázkový výstup dotazu v postupu Určení ekvivalentů rozšířených událostí vrátil následující sadu výsledků:

    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  
    

    Pokud chcete tuto akci převést na ekvivalent rozšířených událostí, přidají se sqlserver.sp_statement_starting a události sqlserver.sp_statement_completed se seznamem akcí. Predikátové příkazy jsou zahrnuty jako klauzule 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. Přidejte cíl asynchronního souboru a nahraďte cesty k souborům umístěním, kam chcete výstup uložit. Při specifikaci cíle souboru musíte uvést soubor protokolu a cestu k souboru metadat.

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

Zobrazení výsledků

  1. K zobrazení výstupu můžete použít funkci sys.fn_xe_file_target_read_file. Uděláte to tak, že spustíte následující dotaz a nahradíte cesty k souborům zadanými cestami:

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

    Poznámka:

    Převod dat události na XML je volitelný.

    Další informace o funkci sys.fn_xe_file_target_read_file naleznete v tématu 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');  
    

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

Viz také

Zobrazení ekvivalentů rozšířených událostí ke třídám událostí trasování SQL