Konvertieren eines vorhandenen SQL-Ablaufverfolgungsskripts in eine Sitzung für erweiterte EreignisseConvert an Existing SQL Trace Script to an Extended Events Session

Dieses Thema gilt für: JaSQL ServerJaAzure SQL-DatenbankkeineAzure SQL Data Warehouse keine Parallel DatawarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Wenn Sie ein vorhandenes SQL-Ablaufverfolgungsskript haben, das Sie in eine Sitzung für erweiterte Ereignisse konvertieren möchten, können Sie die Vorgehensweisen in diesem Thema verwenden, um eine entsprechende Sitzung für erweiterte Ereignisse zu erstellen.If you have an existing SQL Trace script that you want to convert to an Extended Events session, you can use the procedures in this topic to create an equivalent Extended Events session. Mit den Informationen in den Systemtabellen „trace_xe_action_map“ und „trace_xe_event_map“ können Sie die Informationen sammeln, die für die Konvertierung erforderlich sind.By using the information in the trace_xe_action_map and trace_xe_event_map system tables, you can collect the information that you must have to do the conversion.

Die Schritte umfassen Folgendes:The steps include the following:

  1. Führen Sie das vorhandene Skript aus, um eine SQL-Ablaufverfolgungssitzung zu erstellen, und rufen Sie dann die ID der Ablaufverfolgung ab.Execute the existing script to create a SQL Trace session, and then obtain the ID of the trace.

  2. Führen Sie eine Abfrage aus, die die Funktion „fn_trace_geteventinfo“ verwendet, um die entsprechenden Ereignisse in „Erweiterte Ereignisse“ und die Aktionen für die einzelnen Ereignisklassen der SQL-Ablaufverfolgung sowie ihre zugeordneten Spalten zu suchen.Run a query that uses the fn_trace_geteventinfo function to find the equivalent Extended Events events and actions for each SQL Trace event class and its associated columns.

  3. Verwenden Sie die Funktion „fn_trace_getfilterinfo“, um die zu verwendenden Filter und die entsprechenden Aktionen für „Erweiterte Ereignisse“ aufzulisten.Use the fn_trace_getfilterinfo function to list the filters and the equivalent Extended Events actions to use.

  4. Erstellen Sie mithilfe der entsprechenden Ereignisse, Aktionen und Prädikate (Filter) für erweiterte Ereignisse manuell eine Sitzung für erweiterte Ereignisse.Manually create an Extended Events session, using the equivalent Extended Events events, actions, and predicates (filters).

So rufen Sie die Ablaufverfolgungs-ID abTo obtain the trace ID

  1. Öffnen Sie das SQL-Ablaufverfolgungsskript im Abfrage-Editor, und führen Sie dann das Skript aus, um die Ablaufverfolgungssitzung zu erstellen.Open the SQL Trace script in Query Editor, and then execute the script to create the trace session. Die Ablaufverfolgungssitzung muss nicht ausgeführt werden, um diese Vorgehensweise auszuführen.Note that the trace session does not need to be running to complete this procedure.

  2. Rufen Sie die ID der Ablaufverfolgung ab.Obtain the ID of the trace. Verwenden Sie hierzu die folgende Abfrage:To do this, use the following query:

    SELECT * FROM sys.traces;  
    GO  
    

    Hinweis

    Die Ablaufverfolgungs-ID 1 gibt in der Regel die Standardablaufverfolgung an.Trace ID 1 typically indicates the default trace.

So bestimmen Sie die Entsprechungen für erweiterte EreignisseTo determine the Extended Events equivalents

  1. Führen Sie die folgende Abfrage aus, wobei trace_id auf den Wert der Ablaufverfolgungs-ID festgelegt wird, die Sie in der vorherigen Prozedur abgerufen haben, um die entsprechenden Ereignisse und Aktionen für „Erweiterte Ereignisse“ zu bestimmen.To determine the equivalent Extended Events events and actions, run the following query, where trace_id is set to the value of the trace ID that you obtained in the previous procedure.

    Hinweis

    In diesem Beispiel wird die Ablaufverfolgungs-ID für die Standardablaufverfolgung (1) verwendet.In this example, the trace ID for the default trace (1) is used.

    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;  
    

    Die entsprechende Ereignis-ID für erweiterte Ereignisse, der Paketname, der Ereignisname, die Spalten-ID und der Aktionsname werden zurückgegeben.The equivalent Extended Events event ID, package name, event name, column ID and action name are returned. Diese Ausgabe verwenden Sie in der Vorgehensweise "So erstellen Sie die Sitzung für erweiterte Ereignisse" weiter unten in diesem Thema.You will use this output in the procedure "To create the Extended Events session" later in this topic.

    In einigen Fällen wird einem Ereignisdatenfeld, das standardmäßig im Ereignis für erweiterte Ereignisse enthalten ist, die gefilterte Spalte zugeordnet.In some cases, the filtered column maps to an event data field that is included by default in the Extended Events event. Daher ist die Spalte "Extended_Events_action_name" NULL.Therefore, the "Extended_Events_action_name" column will be NULL. Wenn dies auftritt, müssen Sie wie folgt vorgehen, zu bestimmen, welches Datenfeld der gefilterten Spalte entspricht:If this occurs, you must do the following to determine which data field is equivalent to the filtered column:

    1. Identifizieren Sie für die Aktionen, die NULL zurückgeben, welche SQL-Ablaufverfolgungs-Ereignisklassen in dem Skript die gefilterte Spalten enthalten.For the actions that return NULL, identify which SQL Trace event classes in the script contain the column that is being filtered.

      Möglicherweise haben Sie z.B. die Ereignisklasse „SP:StmtCompleted“ verwendet und einen Filter für den Namen der Ablaufverfolgungsspalte „Dauer“ (Ereignisklassen-ID 45 und Spalten-ID 13 der SQL-Ablaufverfolgung) angegeben.For example, you may have used the SP:StmtCompleted event class, and specified a filter on the Duration trace column name (SQL Trace event class ID 45, and SQL Trace column ID 13). In diesem Fall wird der Aktionsname in den Abfrageergebnissen als NULL angezeigt.In this case, the action name will appear as NULL in the query results.

    2. Suchen Sie für jede SQL-Ablaufverfolgungs-Ereignisklasse, die Sie im vorherigen Schritt identifiziert haben, den entsprechenden Namen des Ereignisses für erweiterte Ereignisse.For each SQL Trace event class that you identified in the previous step, find the equivalent Extended Events event name. (Wenn Sie sich bzgl. des entsprechenden Ereignisnamens unsicher sind, verwenden Sie die Abfrage aus dem Thema Anzeigen der Entsprechungen von erweiterten Ereignissen für SQL-Ablaufverfolgungsklassen.)(If you are not sure of the equivalent event name, use the query in the topic View the Extended Events Equivalents to SQL Trace Event Classes.)

    3. Verwenden Sie die folgende Abfrage, um die richtigen Datenfelder zu identifizieren, die für die Ereignisse verwendet werden sollen, die Sie im vorherigen Schritt identifiziert haben.Use the following query to identify the correct data fields to use for the events that you identified in the previous step. Die Abfrage zeigt die Datenfelder für erweiterte Ereignisse in der "event_field"-Spalte an.The query shows the Extended Events data fields in the "event_field" column. Ersetzen Sie in der Abfrage durch den Namen eines Ereignisses, das Sie im vorherigen Schritt angegeben haben.In the query, replace <event_name> with the name of an event that you specified in the previous step.

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

      Beispielsweise ist die Ereignisklasse „SP:StmtCompleted“ dem erweiterten Ereignis „sp_statement_completed“ zugeordnet.For example, the SP:StmtCompleted event class maps to the sp_statement_completed Extended Events event. Wenn Sie „sp_statement_completed“ in der Abfrage als Ereignisnamen angeben, werden in der Spalte „event_field“ die Felder angezeigt, die standardmäßig in dem Ereignis enthalten sind.If you specify sp_statement_completed as the event name in the query, the "event_field" column shows the fields that are included by default with the event. Wenn Sie sich die Felder ansehen, werden Sie sehen, dass es ein Feld "duration" gibt.Looking at the fields, you can see that there is a "duration" field. Um den Filter in der entsprechenden Sitzung für erweiterte Ereignisse zu erstellen, würden Sie ein Prädikat, z. B. "WHERE duration > 0" hinzufügen.To create the filter in the equivalent Extended Events session, you would add a predicate such as "WHERE duration > 0". Ein Beispiel finden Sie in der Vorgehensweise "So erstellen Sie die Sitzung für erweiterte Ereignisse" weiter unten in diesem Thema.For an example, see the "To create the Extended Events session" procedure in this topic.

So erstellen Sie die Sitzung für erweiterte EreignisseTo create the Extended Events session

Verwenden Sie den Abfrage-Editor, um die Sitzung für erweiterte Ereignisse zu erstellen und die Ausgabe in eine Dateiziel zu schreiben.Use Query Editor to create the Extended Events session, and to write the output to a file target. Die folgenden Schritte beschreiben eine einzelne Abfrage, mit Erklärungen, um Ihnen zu zeigen, wie die Abfrage erstellt wird.The following steps describe a single query, with explanations to show you how to build the query. Die vollständige Beispielabfrage finden Sie im Abschnitt "Beispiel" dieses Themas.For the full query example, see the "Example" section of this topic.

  1. Fügen Sie Anweisungen hinzu, um die Ereignissitzung zu erstellen, und ersetzten SieSitzungsname durch den Namen, den Sie für die Sitzung für erweiterte Ereignisse verwenden möchten.Add statements to create the event session, replacing session_name with the name that you want to use for the Extended Events session.

    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. Fügen Sie die Ereignisse und Aktionen für erweiterte Ereignisse hinzu, die in der Vorgehensweise "So bestimmen Sie die Entsprechungen für erweiterte Ereignisse" als Ausgabe zurückgegeben wurden, und fügen Sie die Prädikate (Filter) hinzu, die Sie in der Vorgehensweise "So bestimmen Sie die Filter, die im Skript verwendet werden" identifiziert haben.Add the Extended Events events and actions that were returned as output in the procedure "Determine the Extended Events equivalents", and add the predicates (filters) that you identified in the procedure "To determine the filters that were used in the script".

    Im folgenden Beispiel wird ein SQL-Ablaufverfolgungsskript, das die Ereignisklassen „SQL:StmtStarting“ und „SP:StmtCompleted“ einschließt, mit Filtern für die Sitzungs-ID und die Dauer verwendet.The following example uses a SQL Trace script that includes the SQL:StmtStarting and SP:StmtCompleted event classes, with filters for session ID and duration. Die Beispielausgabe für die Abfrage in der Vorgehensweise "So bestimmen Sie die Entsprechungen für erweiterte Ereignisse" gab das folgende Resultset zurück:Sample output for the query in the "Determine the Extended Events equivalents" procedure returned the following result set:

    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  
    

    Die Ereignisse „sqlserver.sp_statement_starting“ und „sqlserver.sp_statement_completed“ werden mit einer Liste von Aktionen hinzugefügt, um dies in die Entsprechung für erweiterte Ereignisse konvertieren.To convert this to the Extended Events equivalent, the sqlserver.sp_statement_starting and the sqlserver.sp_statement_completed events are added, with a list of actions. Prädikatanweisungen sind als WHERE-Klauseln eingeschlossen.Predicate statements are included as WHERE clauses.

    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. Fügen Sie das asynchrone Dateiziel hinzu, und ersetzen Sie dabei die Dateipfade durch den Speicherort, an dem Sie die Ausgabe speichern möchten.Add the asynchronous file target, replacing the file paths with the location where you want to save the ouput. Wenn Sie das Dateiziel angeben, müssen Sie einen Dateipfad für die Protokolldatei sowie die Metadatendatei angeben.When specifying the file target, you must include a log file and metadata file path file.

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

So zeigen Sie die Ergebnisse anTo view the results

  1. Sie können die Funktion „sys.fn_xe_file_target_read_file“ verwenden, um die Ausgabe anzuzeigen.You can use the sys.fn_xe_file_target_read_file function to view the output. Führen Sie hierzu die folgende Abfrage aus, und ersetzen Sie dabei die Dateipfade durch die angegebenen Pfade:To do this, run the following query, replacing the file paths with the paths that you specified:

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

    Hinweis

    Die Umwandlung der Ereignisdaten in XML ist optional.Casting the event data as XML is optional.

    Weitere Informationen über die Funktion „sys.fn_xe_file_target_read_file“ finden Sie unter sys.fn_xe_file_target_read_file (Transact-SQL).For more information about the sys.fn_xe_file_target_read_file function, see 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');  
    

BeispielExample

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

Weitere Informationen finden Sie unterSee Also

Anzeigen der Entsprechungen von erweiterten Ereignissen für SQL-AblaufverfolgungsklassenView the Extended Events Equivalents to SQL Trace Event Classes