Condividi tramite


Convertire uno script di Traccia SQL esistente in una sessione Eventi estesi

Se si dispone di uno script di Traccia SQL esistente che si desidera convertire in una sessione Eventi estesi, è possibile utilizzare le procedure descritte in questo argomento per creare una sessione Eventi estesi equivalente. Utilizzando le informazioni contenute nelle tabelle di sistema trace_xe_action_map e trace_xe_event_map, è possibile raccogliere le informazioni necessarie per la conversione.

I passaggi necessari sono i seguenti:

  1. Eseguire lo script esistente per creare una sessione di Traccia SQL, quindi ottenere l'ID della traccia.

  2. Eseguire una query che utilizzi la funzione fn_trace_geteventinfo per trovare gli eventi e le azioni equivalenti degli eventi estesi per ogni classe di evento di Traccia SQL e per le colonne associate.

  3. Utilizzare la funzione fn_trace_getfilterinfo per elencare i filtri e le azioni equivalenti degli eventi estesi da utilizzare.

  4. Creare manualmente una sessione Eventi estesi, utilizzando gli eventi, le azioni e i predicati (filtri) equivalenti degli eventi estesi.

Per ottenere l'ID della traccia

  1. Aprire lo script di Traccia SQL nell'editor di query e quindi eseguire lo script per creare la sessione di traccia. Si noti che non è necessario che la sessione di traccia sia in esecuzione per completare questa procedura.

  2. Ottenere l'ID della traccia. A tale scopo, utilizzare la query seguente:

    SELECT * FROM sys.traces;
    GO
    

    [!NOTA]

    L'ID di traccia 1 indica in genere la traccia predefinita.

Per determinare gli equivalenti degli eventi estesi

  1. Per determinare gli eventi equivalenti degli eventi estesi, eseguire la query seguente, dove trace_id è impostato sul valore dell'ID di traccia ottenuto nella procedura descritta in precedenza.

    [!NOTA]

    In questo esempio, viene utilizzato l'ID della traccia predefinita (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;
    

    Vengono restituiti l'ID di evento, il nome di pacchetto, il nome di evento, l'ID di colonna e il nome di azione equivalenti degli eventi estesi. Questo output verrà utilizzato nella procedura "Per creare la sessione Eventi estesi", più avanti in questo argomento.

    In alcuni casi, per la colonna filtrata viene eseguito il mapping a un campo dati di evento incluso per impostazione predefinita nell'evento di eventi estesi. La colonna "Extended_Events_action_name" sarà pertanto NULL. Se questo si verifica, è necessario effettuare le operazioni seguenti per determinare il campo dati equivalente alla colonna filtrata:

    1. Per le azioni che restituiscono NULL, identificare le classi di eventi di Traccia SQL nello script che contengono la colonna filtrata.

      Potrebbe ad esempio essere stata utilizzata la classe di evento SP:StmtCompleted ed essere stato specificato un filtro sul nome della colonna di traccia Duration (ID classe di evento di Traccia SQL 45 e ID colonna di Traccia SQL 13). In questo caso, il nome dell'azione verrà visualizzato come NULL nei risultati della query.

    2. Per ogni classe di evento di Traccia SQL identificata nel passaggio precedente, trovare il nome dell'evento equivalente degli eventi estesi. Se non si è certi di quale sia il nome dell'evento equivalente, utilizzare la query inclusa nell'argomento Visualizzare gli eventi estesi equivalenti alle classi di eventi di Traccia SQL.

    3. Utilizzare la query seguente per identificare i campi dati corretti da utilizzare per gli eventi identificati nel passaggio precedente. Nella query i campi dati degli eventi estesi sono riportati nella colonna "event_field". Nella query sostituire <event_name> con il nome di un evento specificato nel passaggio precedente.

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

      Per la classe di evento SP:StmtCompleted, ad esempio, viene eseguito il mapping all'evento sp_statement_completed degli eventi estesi. Se si specifica sp_statement_completed come nome di evento nella query, nella colonna "event_field" vengono visualizzati i campi inclusi per impostazione predefinita nell'evento. Analizzando i campi, è possibile notare un campo relativo alla durata ("duration"). Per creare il filtro nella sessione Eventi estesi equivalente, è necessario aggiungere un predicato, ad esempio"WHERE duration > 0". Per un esempio, vedere la procedura "Per creare la sessione Eventi estesi", più avanti in questo argomento.

Per creare la sessione Eventi estesi

Utilizzare l'editor di query per creare la sessione Eventi estesi e scrivere l'output in una destinazione file. Nei passaggi seguenti viene descritta una singola query e viene illustrato come compilarla. Per l'esempio di query completo, vedere la sezione "Esempio" di questo argomento.

  1. Aggiungere istruzioni per creare la sessione eventi, sostituendo session_name con il nome che si desidera utilizzare per la sessione Eventi estesi.

    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. Aggiungere gli eventi e le azioni degli eventi estesi restituiti come output nella procedura "Per determinare gli equivalenti degli eventi estesi" e aggiungere i predicati (filtri) identificati nella procedura "Per determinare i filtri utilizzati nello script".

    Nell'esempio seguente viene utilizzato uno script di Traccia SQL che include le classi di eventi SQL:StmtStarting e SP:StmtCompleted, con i filtri per ID sessione e durata. L'output di esempio per la query nella procedura "Per determinare gli equivalenti degli eventi estesi" ha restituito il set di risultati seguente:

    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
    

    Per eseguire la conversione nell'equivalente degli eventi estesi, vengono aggiunti gli eventi sqlserver.sp_statement_starting e sqlserver.sp_statement_completed, con un elenco di azioni. Le istruzioni dei predicati sono incluse come clausole 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. Aggiungere la destinazione file asincrona, sostituendo i percorsi di file con il percorso in cui si desidera salvare l'output. Quando si specifica la destinazione file, è necessario includere un file di percorso del file di log e del file di metadati.

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

Per visualizzare i risultati

  1. Per visualizzare l'output, è possibile utilizzare la funzione sys.fn_xe_file_target_read_file. A tale scopo, eseguire la query seguente, sostituendo i percorsi di file con i percorsi specificati:

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

    [!NOTA]

    L'esecuzione del cast dei dati degli eventi in formato XML è facoltativa.

    Per ulteriori informazioni sulla funzione sys.fn_xe_file_target_read_file, vedere sys.fn_xe_file_target_read_file (Transact-SQL).

Esempio

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

Vedere anche

Concetti

Visualizzare gli eventi estesi equivalenti alle classi di eventi di Traccia SQL