Partilhar via


Converter um script de rastreamento SQL existente numa sessão de eventos estendida

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Se tiver um script SQL Trace existente que pretende converter numa sessão de Eventos Estendidos, pode usar os procedimentos deste tópico para criar uma sessão equivalente de Eventos Estendidos. Ao usar a informação das tabelas trace_xe_action_map e trace_xe_event_map do sistema, pode recolher a informação necessária para fazer a conversão.

Os passos incluem os seguintes:

  1. Execute o script existente para criar uma sessão SQL Trace e depois obtenha o ID do trace.

  2. Execute uma consulta que use a função fn_trace_geteventinfo para encontrar os eventos e ações equivalentes de Eventos Estendidos para cada classe de evento SQL Trace e as suas colunas associadas.

  3. Use a função fn_trace_getfilterinfo para listar os filtros e as ações equivalentes de Eventos Estendidos a utilizar.

  4. Criar manualmente uma sessão de Eventos Estendidos, usando os eventos, ações e predicados (filtros) equivalentes de Eventos Estendidos.

Para obter o ID de rastreio

  1. Abra o script SQL Trace no Editor de Consultas e depois execute o script para criar a sessão de rastreamento. Note que a sessão de rastreamento não precisa de estar a correr para completar este procedimento.

  2. Obtenha o ID do rastreio. Para isso, utilize a seguinte consulta:

    SELECT * FROM sys.traces;  
    GO  
    

    Observação

    O ID de traço 1 indica tipicamente o traço padrão.

Para determinar os equivalentes dos Eventos Estendidos

  1. Para determinar os eventos e ações equivalentes de Eventos Estendidos, execute a seguinte consulta, onde trace_id é definido para o valor do ID de traço que obteve no procedimento anterior.

    Observação

    Neste exemplo, é usado o ID de traço para o traço padrão (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;  
    

    O ID do evento equivalente dos Extended Events, nome do pacote, nome do evento, ID da coluna e nome da ação são retornados. Irá usar este resultado no procedimento "Para criar a sessão de Eventos Estendidos" mais adiante neste tópico.

    Em alguns casos, a coluna filtrada mapeia para um campo de dados de evento que é incluído por padrão no evento Extended Events. Portanto, a coluna "Extended_Events_action_name" será NULL. Se isto ocorrer, deve fazer o seguinte para determinar qual o campo de dados que é equivalente à coluna filtrada:

    1. Para as ações que retornam NULL, identifique quais as classes de evento SQL Trace no script que contêm a coluna que está a ser filtrada.

      Por exemplo, pode ter usado a classe de evento SP:StmtCompleted e especificado um filtro no nome da coluna de rastreio Duration (ID da classe de evento do SQL Trace 45 e ID da coluna do SQL Trace 13). Neste caso, o nome da ação aparecerá como NULL nos resultados da consulta.

    2. Para cada classe de evento SQL Trace que identificaste no passo anterior, encontra o nome equivalente do evento Extended Events. (Se não tiver a certeza do nome equivalente do evento, use a consulta no tópico Ver os Equivalentes de Eventos Estendidos às Classes de Eventos de Traço SQL.)

    3. Use a seguinte consulta para identificar os campos de dados corretos a utilizar para os eventos que identificou no passo anterior. A consulta mostra os campos de dados de Eventos Estendidos na coluna "event_field". Na consulta, substitua< event_name> pelo nome de um evento que especificou no passo anterior.

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

      Por exemplo, a classe de evento SP:StmtCompleted corresponde ao evento sp_statement_completed Extended Events. Se especificar sp_statement_completed como nome do evento na consulta, a coluna "event_field" mostra os campos que estão incluídos por defeito com o evento. Olhando para os campos, pode ver que existe um campo de "duração". Para criar o filtro na sessão equivalente de Eventos Estendidos, adicionaria um predicado como "ONDE duração > 0". Para um exemplo, consulte o procedimento "Para criar a sessão de Eventos Estendidos" neste tópico.

Para criar a sessão de Eventos Estendidos

Use o Editor de Consultas para criar a sessão de Eventos Estendidos e escrever a saída num ficheiro de destino. Os passos seguintes descrevem uma única consulta, com explicações para lhe mostrar como construir a consulta. Para o exemplo completo da consulta, veja a secção "Exemplo" deste tópico.

  1. Adicione instruções para criar a sessão de eventos, substituindo session_name pelo nome que pretende usar para a sessão de eventos estendidos.

    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. Adicione os eventos e ações de Eventos Estendidos que foram devolvidos como saída no procedimento "Determinar os equivalentes de Eventos Estendidos", e adicione os predicados (filtros) que identificou no procedimento "Para determinar os filtros que foram usados no script".

    O exemplo seguinte utiliza um script SQL Trace que inclui as classes de eventos SQL:StmtStarting e SP:StmtCompletified, com filtros para ID de sessão e duração. O exemplo de saída para a consulta do procedimento "Determine the Extended Events equivalents" resultou no seguinte conjunto de resultados:

    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  
    

    Para converter isto no equivalente de Eventos Estendidos, são adicionados os eventos sqlserver.sp_statement_starting e sqlserver.sp_statement_completed, com uma lista de ações. As sentenças de predicado são incluídas como cláusulas 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. Adicione o destino do ficheiro assíncrono, substituindo os caminhos do ficheiro pelo local onde pretende guardar a saída. Ao especificar o destino do ficheiro, deve incluir um ficheiro de registo e um ficheiro de caminho do ficheiro de metadados.

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

Para ver os resultados

  1. Podes usar a função sys.fn_xe_file_target_read_file para ver a saída. Para isso, execute a seguinte consulta, substituindo os caminhos dos ficheiros pelos caminhos que especificou:

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

    Observação

    A conversão dos dados do evento para XML é opcional.

    Para mais informações sobre a função sys.fn_xe_file_target_read_file, veja 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');  

Ver também

Exibir os eventos estendidos equivalentes a classes de evento de rastreamento SQL