Ziele für erweiterte Ereignisse in SQL ServerTargets for Extended Events in SQL Server

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL DatabaseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database

Dieser Artikel erläutert Zweck und Art der Verwendung von package0-Zielen für erweiterte Ereignisse in SQL Server.This article explains when and how to use the package0 targets for extended events in SQL Server. Der vorliegende Artikel erläutert für jedes Ziel:For each target, the present article explains:

  • dessen Fähigkeiten im Sammeln und Melden der von Ereignissen gesendeten DatenIts abilities in gathering and reporting the data sent by events.
  • dessen Parameter, es sei denn, der Parameter ist selbsterklärendIts parameters, except where the parameter is self-explanatory.

XQuery-BeispielXQuery example

Der ring_buffer-Abschnitt enthält ein Beispiel zur Verwendung von XQuery in Transact-SQL zum Kopieren einer XML-Zeichenfolge in ein relationales Rowset.The ring_buffer section includes an example of using XQuery in Transact-SQL to copy a string of XML into a relational rowset.

VoraussetzungenPrerequisites

  • Allgemeine Kenntnisse der Grundlagen von erweiterten Ereignissen. Informationen finden Sie im Schnellstart: Erweiterte Ereignisse in SQL Server.Be generally familiar with the basics of extended events, as described in Quick Start: Extended events in SQL Server.

  • Vorhandene Installation einer neueren Version des häufig aktualisierten Hilfsprogramms SQL Server Management Studio (SSMS.exe).Have installed a recent version of the frequently updated utility SQL Server Management Studio (SSMS.exe). Einzelheiten dazu finden Sie unter:For details see:

  • In SSMS.exe sollte die Verwendung des Objekt-Explorers bekannt sein, um mit der rechten Maustaste auf den Zielknoten für die Ereignissitzung zu klicken, um die bequeme Anzeige der Ausgabedatenzu erreichen.In SSMS.exe, know how to use the Object Explorer to right-click the target node under your event session, for easy viewing of the output data.

    • Die Ereignisdaten werden als XML-Zeichenfolge erfasst.The event data is captured as an XML string. Hingegen werden die Daten in diesem Artikel als relationale Zeilen angezeigt.Yet in this article the data is displayed in relational rows. SSMS wurde zum Anzeigen der Daten verwendet, daraus wurden sie kopiert und in diesen Artikel eingefügt.SSMS was used to view the data, and then was copied and pasted into this article.
    • Die alternative T-SQL-Technik zum Generieren von Rowsets aus XML wird im ring_buffer-Abschnitterläutert.The alternative T-SQL technique for generating rowsets from XML is explained in the ring_buffer section. Sie umfasst den Einsatz von XQuery.It involves XQuery.

Parameter, Aktionen und FelderParameters, actions, and fields

In Transact-SQL spielt die Anweisung CREATE EVENT SESSION die zentrale Rolle bei erweiterten Ereignissen.In Transact-SQL, the CREATE EVENT SESSION statement is central to extended events. Zum Erstellen der Anweisung benötigen Sie in vielen Fällen eine Liste und eine Beschreibung folgender Punkte:To write the statement you often need a list and description of the following:

  • die dem ausgewählten Ereignis zugeordneten FelderThe fields associated with your chosen event.
  • die dem ausgewählten Ziel zugeordneten ParameterThe parameters associated with your chosen target.

SELECT-Anweisungen, die solche Listen aus Systemansichten zurückgeben, können aus dem folgenden Artikel in Abschnitt C kopiert werden:SELECT statements which return such lists from system views are available to copy from the following article, in its section C:

Sie können die im Kontext einer realen CREATE EVENT SESSION-Anweisung verwendeten Parameter, Felder und Aktionen über diesen Linkanzeigen.You can see parameters, fields, and actions used in the context of an actual CREATE EVENT SESSION statement, at this link.

etw_classic_sync_target-Zieletw_classic_sync_target target

Erweiterte Ereignisse von SQL Server können mit der Ereignisablaufverfolgung für Windows (Event Tracing for Windows, ETW) zusammenwirken, um die Systemaktivität zu überwachen.SQL Server extended events can inter-operate with Event Tracing for Windows (ETW) to monitor system activity. Weitere Informationen finden Sie unterFor more information, see:

Dieses ETW-Ziel verarbeitet die empfangenen Daten synchron , während die meisten Ziele asynchroneVerarbeitung aufweisen.This ETW target processes synchronously the data it receives, whereas most targets process asynchronously.

Hinweis

Azure SQL-Datenbank bietet keine Unterstützung für etw_classic_sync_target target.Azure SQL Database does not support the etw_classic_sync_target target.

event_counter-Zielevent_counter target

Das event_counter-Ziel zählt lediglich, wie oft jedes angegebene Ereignis eintritt.The event_counter target merely counts how many times each specified event occurs.

Im Gegensatz zu den meisten anderen Zielen:Unlike most other targets:

  • besitzt event_counter keine ParameterThe event_counter has no parameters.

  • Im Gegensatz zu den meisten Zielen verarbeitet das event_counter-Ziel die empfangenen Daten synchronUnlike most targets, the event_counter target processes synchronously the data it receives.

    • Die synchrone Verarbeitung ist für den einfachen event_counter akzeptabel, da event_counter sehr wenig Verarbeitungsleitung beanspruchtSynchronous is acceptable for the simple event_counter because the event_counter involves so little processing.
    • Die Datenbank-Engine bewirkt die Trennung von jedem Ziel, das zu langsam ist und dadurch die Leistung der Datenbank-Engine zu beeinträchtigen (bremsen) droht.The database engine will disconnect from any target which is too slow and which thereby threatens to slow the performance of the database engine. Das ist ein Grund, warum die meisten Ziele asynchroneVerarbeitung aufweisen.This is one reason why most targets process asynchronously.

Von event_counter erfasste BeispielausgabeExample output captured by event_counter

package_name   event_name         count
------------   ----------         -----
sqlserver      checkpoint_begin   4

Der nächste Punkt ist die CREATE EVENT SESSION, die zu den vorstehenden Ergebnissen geführt hat.Next is the CREATE EVENT SESSION that led to the previous results. Für diesen Test wurde in der EVENT...WHERE-Klausel das Feld package0.counter verwendet, um die Zählung abzubrechen, nachdem die Anzahl auf 4 angestiegen ist.For this test, on the EVENT...WHERE clause, the package0.counter field was used to cease the counting after the count climbed to 4.

CREATE EVENT SESSION [event_counter_1]
    ON SERVER 
    ADD EVENT sqlserver.checkpoint_begin   -- Test by issuing CHECKPOINT; statements.
    (
        WHERE ([package0].[counter] <= (4))   -- A predicate filter.
    )
    ADD TARGET package0.event_counter
    WITH
    (
        MAX_MEMORY = 4096 KB,
        MAX_DISPATCH_LATENCY = 3 SECONDS
    );

event_file-Zielevent_file target

Das Ziel event_file schreibt Ereignissitzungsausgaben vom Puffer in eine Datenträgerdatei:The event_file target writes event session output from buffer to a disk file:

  • Sie geben den Parameter filename= in der ADD TARGET-Klausel an.You specify the filename= parameter on the ADD TARGET clause.

    • Die Erweiterung der Datei muss .xel lauten..xel must be the extension of the file.
  • Der gewählte Dateiname wird vom System als Präfix verwendet, an das eine auf Datum-/Uhrzeit basierende Ganzzahl vom Typ long integer angehängt wird, gefolgt von der XEL-Erweiterung.The file name you choose is used by the system as a prefix to which a date-time based long integer is appended, followed by the .xel extension.

Hinweis

Azure SQL-Datenbank unterstützt nur das Speichern von xel-Dateien in Azure-Blobspeicher.Azure SQL Database only supports storing xel files on Azure blob storage.

Ein Codebeispiel für event_file speziell für SQL-Datenbank (und die verwaltete SQL-Datenbank-Instanz) finden Sie unter Code des Ereignisdateiziels für erweiterte Ereignisse in SQL-Datenbank.For an event_file code example particular to SQL Database (and to SQL Database Managed Instance), see Event File target code for extended events in SQL Database.

CREATE EVENT SESSION mit event_fileCREATE EVENT SESSION with event_file target

Nun folgt die CREATE EVENT SESSION, die wir für den Test verwendet haben.Next is the CREATE EVENT SESSION that we used to test with. Eine der ADD TARGET-Klauseln gibt eine event_file-Datei an.One of the ADD TARGET clauses specifies an event_file.

CREATE EVENT SESSION [locks_acq_rel_eventfile_22]
    ON SERVER 
    ADD EVENT sqlserver.lock_acquired
    (
        SET
            collect_database_name=(1),
            collect_resource_description=(1)

        ACTION (sqlserver.sql_text,sqlserver.transaction_id)

        WHERE
        (
            [database_name]=N'InMemTest2'
            AND
            [object_id]=(370100359)
        )
    ),
    ADD EVENT sqlserver.lock_released
    (
        SET
            collect_database_name=(1),
            collect_resource_description=(1)

        ACTION(sqlserver.sql_text,sqlserver.transaction_id)

        WHERE
        (
            [database_name]=N'InMemTest2'
            AND
            [object_id]=(370100359)
        )
    )
    ADD TARGET package0.event_counter,
    ADD TARGET package0.event_file
    (
        SET     filename=N'C:\Junk\locks_acq_rel_eventfile_22-.xel'
    )
    WITH
    (
        MAX_MEMORY=4096 KB,
        MAX_DISPATCH_LATENCY=10 SECONDS
    );

sys.fn_xe_file_target_read_file-Funktionsys.fn_xe_file_target_read_file function

Das event_file-Ziel speichert die empfangenen Daten in einem binären Format, das für Menschen nicht lesbar ist.The event_file target stores the data it receives in a binary format that is not human readable. Transact-SQL kann den Inhalt der XEL-Datei mithilfe von SELECT FROM aus der Funktion sys.fn_xe_file_target_read_file melden.Transact-SQL can report the contents of the .xel file by SELECTing FROM the sys.fn_xe_file_target_read_file function.

Für SQL Server 2016 und höher hat die folgende T-SQL SELECT-Anweisung die Daten gemeldet.For SQL Server 2016 and later, the following T-SQL SELECT reported the data. Das XEL-Suffix inThe *.xel suffix in the

SELECT f.*
        --,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
    FROM
        sys.fn_xe_file_target_read_file(
            'C:\junk\locks_acq_rel_eventfile_22-*.xel',
            null, null, null)  AS f;

Für SQL Server 2014würde eine SELECT-Anweisung ähnlich der folgenden die Meldung der Daten übernehmen.For SQL Server 2014, a SELECT similar to the following would report the data. Nach SQL Server 2014 werden keine XEM-Dateien mehr verwendet.After SQL Server 2014, the .xem files are no longer used.

SELECT f.*
        --,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
    FROM
        sys.fn_xe_file_target_read_file(
            'C:\junk\locks_acq_rel_eventfile_22-*.xel',
            'C:\junk\metafile.xem',
            null, null)  AS f;

Natürlich können Sie die XEL-Daten auch manuell auf der SSMS-Benutzeroberfläche anzeigen:Of course, you can also manually use the SSMS UI to see the .xel data:

Im event_file-Ziel gespeicherte DatenData stored in the event_file target

Der nächste Punkt ist der Bericht, der sich durch den SELECT aus sys.fn_xe_file_target_read_filein SQL Server 2016 ergibt.Next is the report from SELECTing from sys.fn_xe_file_target_read_file, in SQL Server 2016.

module_guid                            package_guid                           object_name     event_data                                                                                                                                                                                                                                                                                          file_name                                                      file_offset
-----------                            ------------                           -----------     ----------                                                                                                                                                                                                                                                                                          ---------                                                      -----------
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   lock_acquired   <event name="lock_acquired" package="sqlserver" timestamp="2016-08-07T20:13:35.827Z"><action name="transaction_id" package="sqlserver"><value>39194</value></action><action name="sql_text" package="sqlserver"><value><![CDATA[  select top 1 * from dbo.T_Target;  ]]></value></action></event>   C:\junk\locks_acq_rel_eventfile_22-_0_131150744126230000.xel   11776
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   lock_released   <event name="lock_released" package="sqlserver" timestamp="2016-08-07T20:13:35.832Z"><action name="transaction_id" package="sqlserver"><value>39194</value></action><action name="sql_text" package="sqlserver"><value><![CDATA[  select top 1 * from dbo.T_Target;  ]]></value></action></event>   C:\junk\locks_acq_rel_eventfile_22-_0_131150744126230000.xel   11776

histogram-Zielhistogram target

Das histogram -Ziel ist cooler als das event_counter-Ziel.The histogram target is fancier than the event_counter target. histogram kann Folgendes:The histogram can do the following:

  • Vorkommen für mehrere Elemente separat zählenCount occurrences for several items separately.
  • Vorkommen von verschiedenen Elementtypen zählenCount occurrences of different types of items:
    • EreignisfelderEvent fields.
    • AktionenActions.

Der Parameter source_type bildet den Schlüssel bei der Steuerung des histogram-Ziels:The source_type parameter is the key to controlling the histogram target:

  • source_type=0 : Sammeln von Daten für Ereignisfeldersource_type=0 - Means collect data for event fields).
  • source_type=1 : Sammeln von Daten für Aktionensource_type=1 - Means collect data for actions.
    • 1 ist der Standardwert1 is the default.

Der Standardwert des Parameters „slots“ ist 256.The 'slots' parameter default is 256. Wenn Sie einen anderen Wert zuweisen, wird der Wert auf die nächste Potenz von 2 aufgerundet.If you assign another value, the value is rounded up to the next power of 2.

  • Beispielsweise würde „slots=59“ auf „=64“ aufgerundet.For example, slots=59 would be rounded up to =64.

Action -Beispiel für histogramAction example for histogram

In der TARGET...SET-Klausel legt die folgende Transact-SQL CREATE EVENT SESSION-Anweisung die Zielparameterzuweisung als source_type=1fest.On its TARGET...SET clause, the following Transact-SQL CREATE EVENT SESSION statement specifies the target parameter assignment of source_type=1. Die 1 bedeutet, dass das histogram-Ziel eine Aktion nachverfolgt.The 1 means the histogram target tracks an action.

Im aktuellen Beispiel bietet die Klausel EVENT...ACTION dem Ziel zufällig nur eine Aktion zur Auswahl an, nämlich sqlos.system_thread_id.In the present example, the EVENT...ACTION clause offer happens to offer only one action for the target to choose, namely sqlos.system_thread_id. In der TARGET...SET-Klausel sehen wir die Zuweisung source=N'sqlos.system_thread_id' .On the TARGET...SET clause, we see the assignment source=N'sqlos.system_thread_id' assignment.

  • Um mehr als eine Quellaktion nachzuverfolgen, können Sie der CREATE EVENT SESSION-Anweisung ein zweites histogram-Ziel hinzufügen.To track more than one source action, you can add a second histogram target to your CREATE EVENT SESSION statement.
CREATE EVENT SESSION [histogram_lockacquired]
    ON SERVER 
    ADD EVENT sqlserver.lock_acquired
        (
        ACTION
            (
            sqlos.system_thread_id
            )
        )
    ADD TARGET package0.histogram
        (
        SET
            filtering_event_name=N'sqlserver.lock_acquired',
            slots=(16),
            source=N'sqlos.system_thread_id',
            source_type=1
        )
    WITH
        (
        <.... (For brevity, numerous parameter assignments generated by SSMS.exe are not shown here.) ....>
        );

Die folgenden Daten wurden erfasst.The following data was captured. Die Werte in der Spalte value waren system_thread_id-Werte.The values under the value column were system_thread_id values. Beispielsweise wurden im Thread 6540 insgesamt 236 Sperren in Anspruch genommen.For instance, a total of 236 locks were taken under thread 6540.

value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28

Verwenden von SELECT zum Entdecken der verfügbaren AktionenSELECT to discover available actions

Die C.3 SELECT-Anweisung kann die Aktionen finden, die Ihnen im System zur Angabe in Ihrer CREATE EVENT SESSION-Anweisung zur Verfügung stehen.The C.3 SELECT statement can find the actions that the system has available for you to specify on your CREATE EVENT SESSION statement. In der WHERE-Klausel müssten Sie dazu zuerst den Filter o.name LIKE bearbeiten, sodass er den Aktionen entspricht, die Sie interessieren.In the WHERE clause, you would first edit the o.name LIKE filter to match the actions that interest you.

Hier sehen Sie ein Beispielrowset, das von der C.3 SELECT-Anweisung zurückgegeben wird.Next is a sample rowset returned by the C.3 SELECT. Die Aktion system_thread_id befindet sich in der zweiten Zeile.The system_thread_id action is seen in the second row.

Package-Name   Action-Name                 Action-Description
------------   -----------                 ------------------
package0       collect_current_thread_id   Collect the current Windows thread ID
sqlos          system_thread_id            Collect current system thread ID
sqlserver      create_dump_all_threads     Create mini dump including all threads
sqlserver      create_dump_single_thread   Create mini dump for the current thread

Ereignisfeld -Beispiel für histogramEvent field example for histogram

Im folgenden Beispiel ist source_type=0festgelegt.The following example sets source_type=0. Der source= zugewiesene Wert ist ein Ereignisfeld (keine Aktion).The value assigned to source= is an event field (not an action).

CREATE EVENT SESSION [histogram_checkpoint_dbid]
    ON SERVER 
    ADD EVENT  sqlserver.checkpoint_begin
    ADD TARGET package0.histogram
    (
    SET
        filtering_event_name = N'sqlserver.checkpoint_begin',
        source               = N'database_id',
        source_type          = (0)
    )
    WITH
    ( <....> );

Die folgenden Daten wurden vom histogram-Ziel erfasst.The following data was captured by the histogram target. Die Daten zeigen, dass in der Datenbank mit ID=5 7 checkpoint_begin-Ereignisse aufgetreten sind.The data shows that the database that is ID=5 experienced 7 checkpoint_begin events.

value   count
-----   -----
5       7
7       4
6       3

Verwenden von SELECT zum Ermitteln der für das ausgewählte Ereignis verfügbaren FelderSELECT to discover available fields on your chosen event

Die C.4 SELECT-Anweisung zeigt Ereignisfelder an, unter denen Sie wählen können.The C.4 SELECT statement shows event fields that you can choose from. Sie müssten hier zunächst den Filter o.name LIKE bearbeiten, um ihn auf den Namen des ausgewählten Ereignisses festzulegen.You would first edit the o.name LIKE filter to be your chosen event name.

Das folgende Rowset wurde von C.4 SELECT zurückgegeben.The following rowset was returned by the C.4 SELECT. Das Rowset zeigt, dass database_id das einzige Feld des Ereignisses checkpoint_begin ist, das Werte für das histogram-Ziel bereitstellen kann.The rowset shows that database_id is the only one field on the checkpoint_begin event that can supply values for the histogram target.

Package-Name   Event-Name         Field-Name   Field-Description
------------   ----------         ----------   -----------------
sqlserver      checkpoint_begin   database_id  NULL
sqlserver      checkpoint_end     database_id  NULL

pair_matching-Zielpair_matching target

Mithilfe des pair_matching-Ziels können Sie aufgetretene Startereignisse ermitteln, denen kein Endeereignis entspricht.The pair_matching target enables you to detect start events that occurs without a corresponding end event. Es kann beispielsweise auf ein Problem hinweisen, wenn ein lock_acquired-Ereignis eintritt, dem kein entsprechendes lock_released-Ereignis in angemessener Zeit folgt.For instance, it might be a problem when a lock_acquired event occurs but no matching lock_released event follows in a timely manner.

Das System ordnet Start- und Endeereignisse nicht automatisch zu.The system does not automatically match start and end events. Vielmehr müssen Sie dem System die Zuordnung mithilfe Ihrer CREATE EVENT SESSION-Anweisung erläutern.Instead, you explain the matching to the system in your CREATE EVENT SESSION statement. Wenn ein Start- und ein Endeereignis zugeordnet wurden, wird das Paar verworfen, damit die Konzentration ganz auf den nicht zugeordneten Startereignissen liegt.When a start and end event are matched, the pair is discarded so everyone can focus on the unmatched start events.

Suchen von zuzuordnenden Feldern für das Start- und EndeereignispaarFinding matchable fields for the start and end event pair

Mithilfe von C.4 SELECTsehen wir im folgenden Rowset, dass etwa 16 Felder für das lock_acquired-Ereignis vorhanden sind.By using the C.4 SELECT, we see in the following rowset there are about 16 fields for the lock_acquired event. Das hier angezeigte Rowset wurde manuell geteilt, um zu zeigen, welche Felder in unserem Beispiel zugeordnet wurden.The rowset displayed here has been manually split to show which fields our example matched on. Bei einigen Feldern wäre der Versuch der Zuordnung unsinnig, wie etwa für duration bei beiden Ereignissen.Some fields would be silly to try matching, such as on the duration of both events.

Package-Name   Event-Name   Field-Name               Field-Description
------------   ----------   ----------               -----------------
sqlserver   lock_acquired   database_name            NULL
sqlserver   lock_acquired   mode                     NULL
sqlserver   lock_acquired   resource_0               The ID of the locked object, when lock_resource_type is OBJECT.
sqlserver   lock_acquired   resource_1               NULL
sqlserver   lock_acquired   resource_2               The ID of the lock partition, when lock_resource_type is OBJECT, and resource_1 is 0.
sqlserver   lock_acquired   transaction_id           NULL

sqlserver   lock_acquired   associated_object_id     The ID of the object that requested the lock that was acquired.
sqlserver   lock_acquired   database_id              NULL
sqlserver   lock_acquired   duration                 The time (in microseconds) between when the lock was requested and when it was canceled.
sqlserver   lock_acquired   lockspace_nest_id        NULL
sqlserver   lock_acquired   lockspace_sub_id         NULL
sqlserver   lock_acquired   lockspace_workspace_id   NULL
sqlserver   lock_acquired   object_id                The ID of the locked object, when lock_resource_type is OBJECT. For other lock resource types it will be 0
sqlserver   lock_acquired   owner_type               NULL
sqlserver   lock_acquired   resource_description     The description of the lock resource. The description depends on the type of lock. This is the same value as the resource_description column in the sys.dm_tran_locks view.
sqlserver   lock_acquired   resource_type            NULL

Beispiel für pair_matchingExample of pair_matching

Die folgende CREATE EVENT SESSION-Anweisung gibt zwei Ereignisse und zwei Ziele an.The following CREATE EVENT SESSION statement specifies two events, and two targets. Das pair_matching-Ziel gibt zwei Mengen von Feldern für die Zuordnung der Ereignisse zu Paaren an.The pair_matching target specifies two sets of fields to match the events into pairs. Die Reihenfolge der durch Trennzeichen getrennten Felder, die begin_matching_columns= und end_matching_columns= zugewiesen werden, muss übereinstimmen.The sequence of comma-delimited fields assigned to begin_matching_columns= and end_matching_columns= must be the same. Zwischen den durch Trennzeichen getrennten Feldern sind keine Tabstopp- oder Zeilenvorschubzeichen zulässig, jedoch Leerzeichen.No tabs or newlines are allowed between the fields mentioned in the comma-delimited value, although spaces are okay.

Um die Ergebnisse einzuschränken, haben wir zuerst in sys.objects per SELECT ausgewählt, um die object_id unserer Testtabelle zu ermitteln.To narrow the results, we first SELECTed from sys.objects to find the object_id of our test table. Wir haben der EVENT...WHERE-Klausel einen Filter für die betreffende ID hinzugefügt.We added a filter for that one ID to the EVENT...WHERE clause.

CREATE EVENT SESSION [pair_matching_lock_a_r_33]
    ON SERVER 
    ADD EVENT sqlserver.lock_acquired
    (
        SET
            collect_database_name = (1),
            collect_resource_description = (1)

        ACTION (sqlserver.transaction_id)

        WHERE
        (
            [database_name] = 'InMemTest2'
            AND
            [object_id] = 370100359
        )
    ),
    ADD EVENT sqlserver.lock_released
    (
        SET
            collect_database_name = (1),
            collect_resource_description = (1)

        ACTION (sqlserver.transaction_id)

        WHERE
        (
            [database_name] = 'InMemTest2'
            AND
            [object_id] = 370100359
        )
    )
    ADD TARGET package0.event_counter,
    ADD TARGET package0.pair_matching
    (
        SET
            begin_event = N'sqlserver.lock_acquired',
            begin_matching_columns =
                N'resource_0, resource_1, resource_2, transaction_id, database_id',

            end_event = N'sqlserver.lock_released',
            end_matching_columns =
                N'resource_0, resource_1, resource_2, transaction_id, database_id',

            respond_to_memory_pressure = (1)
    )
    WITH
    (
        MAX_MEMORY = 8192 KB,
        MAX_DISPATCH_LATENCY = 15 SECONDS
    );

Zum Testen der Ereignissitzung haben wir absichtlich die Freigabe von erworbenen Sperren verhindert.To test the event session, we purposely prevented to acquired locks from being released. Dies haben wir mit den folgenden T-SQL-Schritten erreicht:We did this with the following T-SQL steps:

  1. BEGIN TRANSACTION.BEGIN TRANSACTION.
  2. UPDATE MeineTabelle....UPDATE MyTable....
  3. Absichtlich wird COMMIT TRANSACTION erst nach dem Untersuchen der Ziele ausgegeben.Purposely not issue a COMMIT TRANSACTION, until after we examined the targets.
  4. Später, nach den Tests, haben wir ein COMMIT TRANSACTION ausgegeben.Later after testing, we issued a COMMIT TRANSACTION.

Das einfache event_counter -Ziel hat die folgenden Ausgabezeilen bereitgestellt.The simple event_counter target provided the following output rows. Da 52-50=2, erfahren wir aus der Ausgabe, dass wir 2 nicht gepaarte lock_acquired-Ereignisse sehen sollten, wenn wir die Ausgabe aus dem pair-matching-Ziel untersuchen.Because 52-50=2, the output tells us we should see 2 unpaired lock_acquired events when we examine the output from the pair-matching target.

package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   52
sqlserver      lock_released   50

Das pair_matching -Ziel hat die folgende Ausgabe bereitgestellt.The pair_matching target provided the following output. Wie aus der event_counter-Ausgabe bereits zu erfahren war, sehen wir tatsächlich 2 lock_acquired-Zeilen.As suggested by the event_counter output, we do indeed see 2 lock_acquired rows. Die Tatsache, dass wir diese zwei Zeilen überhaupt finden, bedeutet, dass diese zwei lock_acquired-Ereignisse nicht gepaart wurden.The fact that we see these rows at all means these two lock_acquired events are unpaired.

package_name   event_name      timestamp                     database_name   duration   mode   object_id   owner_type   resource_0   resource_1   resource_2   resource_description   resource_type   transaction_id
------------   ----------      ---------                     -------------   --------   ----   ---------   ----------   ----------   ----------   ----------   --------------------   -------------   --------------
sqlserver      lock_acquired   2016-08-05 12:45:47.9980000   InMemTest2      0          S      370100359   Transaction  370100359    3            0            [INDEX_OPERATION]      OBJECT          34126
sqlserver      lock_acquired   2016-08-05 12:45:47.9980000   InMemTest2      0          IX     370100359   Transaction  370100359    0            0                                   OBJECT          34126

Die Zeilen für die nicht gepaarten lock_acquired-Ereignisse könnten den T-SQL-Text oder sqlserver.sql_textaus der Sperranforderung enthalten.The rows for the unpaired lock_acquired events could include the T-SQL text, or sqlserver.sql_text, that took the locks. Allerdings wollten wir die Ausgabe schlank halten.But we did not want to bloat the display.

ring_buffer-Zielring_buffer target

Das ring_buffer-Ziel ist praktisch für schnelle und einfache Ereignistests.The ring_buffer target is handy for quick and simple event testing. Beim Beenden der Ereignissitzung wird die gespeicherte Ausgabe verworfen.When you stop the event session, the stored output is discarded.

In diesem ring_buffer-Abschnitt zeigen wir Ihnen außerdem, wie Sie die Transact-SQL-Implementierung von XQuery verwenden können, um den XML-Inhalt von ring_buffer in ein besser lesbares relationales Rowset zu kopieren.In this ring_buffer section we also show how you can use the Transact-SQL implementation of XQuery to copy the XML contents of the ring_buffer into a more readable relational rowset.

CREATE EVENT SESSION mit ring_bufferCREATE EVENT SESSION with ring_buffer

Diese CREATE EVENT SESSION-Anweisung, die das ring_buffer-Ziel verwendet, hat nichts Bemerkenswertes.There is nothing special about this CREATE EVENT SESSION statement, which uses the ring_buffer target.

CREATE EVENT SESSION [ring_buffer_lock_acquired_4]
    ON SERVER 
    ADD EVENT sqlserver.lock_acquired
    (
        SET collect_resource_description=(1)

        ACTION(sqlserver.database_name)

        WHERE
        (
            [object_id]=(370100359)  -- ID of MyTable
            AND
            sqlserver.database_name='InMemTest2'
        )
    )
    ADD TARGET package0.ring_buffer
    (
        SET max_events_limit=(98)
    )
    WITH
    (
        MAX_MEMORY=4096 KB,
        MAX_DISPATCH_LATENCY=3 SECONDS
    );

Für lock_acquired von ring_buffer empfangene XML-AusgabeXML output received for lock_acquired by ring_buffer

Wenn er mithilfe einer SELECT-Anweisung abgerufen wird, liegt der Inhalt in Form einer XML-Zeichenfolge vor.When retrieved by a SELECT statement, the content is in the form of a string of XML. Die folgende Abbildung zeigt die XML-Zeichenfolge, die vom ring_buffer-Ziel in unserem Test gespeichert wurde.The XML string that was stored by the ring_buffer target in our testing, is shown next. Um die folgende XML-Ausgabe halbwegs kurz zu halten, wurden jedoch alle <event>-Elemente bis auf zwei gelöscht.However, for brevity of the following XML display, all but two <event> elements have been erased. Und innerhalb der einzelnen <event>s wurde eine Reihe von überflüssigen <data>-Elementen gelöscht.Further, within each <event>, a handful of extraneous <data> elements have been deleted.

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="6" eventCount="6" droppedCount="0" memoryUsed="1032">
  <event name="lock_acquired" package="sqlserver" timestamp="2016-08-05T23:59:53.987Z">
    <data name="mode">
      <type name="lock_mode" package="sqlserver"></type>
      <value>1</value>
      <text><![CDATA[SCH_S]]></text>
    </data>
    <data name="transaction_id">
      <type name="int64" package="package0"></type>
      <value>111030</value>
    </data>
    <data name="database_id">
      <type name="uint32" package="package0"></type>
      <value>5</value>
    </data>
    <data name="resource_0">
      <type name="uint32" package="package0"></type>
      <value>370100359</value>
    </data>
    <data name="resource_1">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="resource_2">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="database_name">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[]]></value>
    </data>
    <action name="database_name" package="sqlserver">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[InMemTest2]]></value>
    </action>
  </event>
  <event name="lock_acquired" package="sqlserver" timestamp="2016-08-05T23:59:56.012Z">
    <data name="mode">
      <type name="lock_mode" package="sqlserver"></type>
      <value>1</value>
      <text><![CDATA[SCH_S]]></text>
    </data>
    <data name="transaction_id">
      <type name="int64" package="package0"></type>
      <value>111039</value>
    </data>
    <data name="database_id">
      <type name="uint32" package="package0"></type>
      <value>5</value>
    </data>
    <data name="resource_0">
      <type name="uint32" package="package0"></type>
      <value>370100359</value>
    </data>
    <data name="resource_1">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="resource_2">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="database_name">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[]]></value>
    </data>
    <action name="database_name" package="sqlserver">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[InMemTest2]]></value>
    </action>
  </event>
</RingBufferTarget>

Um den vorstehenden XML-Code anzuzeigen, können Sie die folgende SELECT-Anweisung ausgeben, während die Ereignissitzung aktiv ist.To see the preceding XML, you can issue the following SELECT while the event session is active. Die aktiven XML-Daten werden aus der Systemansicht sys.dm_xe_session_targetsabgerufen.The active XML data is retrieved from the system view sys.dm_xe_session_targets.

SELECT
        CAST(LocksAcquired.TargetXml AS XML)  AS RBufXml
    INTO
        #XmlAsTable
    FROM
        (
        SELECT
                CAST(t.target_data AS XML)  AS TargetXml
            FROM
                     sys.dm_xe_session_targets  AS t
                JOIN sys.dm_xe_sessions         AS s

                    ON s.address = t.event_session_address
            WHERE
                t.target_name = 'ring_buffer'
                AND
                s.name        = 'ring_buffer_lock_acquired_4'
        )
            AS LocksAcquired;


SELECT * FROM #XmlAsTable;

XQuery zur Ausgabe des XML-Codes als RowsetXQuery to see the XML as a rowset

Um den vorstehenden XML-Code als relationales Rowset darzustellen, fahren Sie nach der vorstehenden SELECT-Anweisung durch Ausgeben der folgenden T-SQL-Anweisung fort.To see the preceding XML as a relational rowset, continue from the preceding SELECT statement by issuing the following T-SQL. In den kommentierten Zeilen ist jede Verwendung von XQuery erläutert.The commented lines explain each use of XQuery.

SELECT
         -- (A)
         ObjectLocks.value('(@timestamp)[1]',
            'datetime'     )  AS [OccurredDtTm]

        -- (B)
        ,ObjectLocks.value('(data[@name="mode"]/text)[1]',
            'nvarchar(32)' )  AS [Mode]

        -- (C)
        ,ObjectLocks.value('(data[@name="transaction_id"]/value)[1]',
            'bigint' )  AS [TxnId]

        -- (D)
        ,ObjectLocks.value('(action[@name="database_name" and @package="sqlserver"]/value)[1]',
            'nvarchar(128)')  AS [DatabaseName]
    FROM
        #TableXmlCell
    CROSS APPLY
        -- (E)
        TargetDateAsXml.nodes('/RingBufferTarget/event[@name="lock_acquired"]')  AS T(ObjectLocks);

XQuery-Anmerkungen zur vorstehenden SELECT-AnweisungXQuery notes from preceding SELECT

(A)(A)

  • timestamp= Wert des Attributs auf dem <event>-Element.timestamp= attribute's value, on <event> element.
  • Das Konstrukt '(...)[1]' stellt sicher, dass pro Iteration nur 1 Wert zurückgegeben wird, da dies eine erforderliche Einschränkung der .value() XQuery-Methode für Variablen und Spalten vom XML-Datentyp darstellt.The '(...)[1]' construct ensures only 1 value returned per iteration, as is a required limitation of the .value() XQuery method of XML data type variable and columns.

(B)(B)

  • <text> der innere Wert des Elements innerhalb eines <data>-Elements, dessen Attribut name= auf „mode“ festgelegt ist.<text> element's inner value, within a <data> element which has its name= attribute equal to "mode".

(C)(C)

  • <value> der innere Wert des Elements innerhalb eines <data>-Elements, dessen Attribut name= auf „transaction_id“ festgelegt ist.<value> elements inner value, within a <data> element which has its name= attribute equal to "transaction_id".

(D)(D)

  • <event> enthält <action>.<event> contains <action>.
  • Das Attribut name= von <action> ist auf „database_name“ und das Attribut package= auf „sqlserver“ festgelegt (nicht „package0“), der innere Wert des Elements <value> wird abgerufen.<action> having name= attribute equal to "database_name", and package= attribute equal to "sqlserver" (not "package0"), get the inner value of <value> element.

(E)(E)

  • C.A.C.A. bewirkt die Wiederholung der Verarbeitung für jedes einzelne Element <event>, dessen Attribut name= auf „lock_acquired“ festgelegt ist.causes processing to repeat for every individual <event> element which has its name= attribute equal to "lock_acquired".
  • Dies gilt für den von der vorherigen FROM-Klausel zurückgegebenen XML-Code.This applies to the XML returned by the preceding FROM clause.

Ausgabe von XQuery SELECTOutput from XQuery SELECT

Die nächste Abbildung zeigt das vom vorhergehenden T-SQL-Code, des XQuery enthält, generierte Rowset.Next is the rowset generated by the preceding T-SQL which includes XQuery.

OccurredDtTm              Mode    DatabaseName
------------              ----    ------------
2016-08-05 23:59:53.987   SCH_S   InMemTest2
2016-08-05 23:59:56.013   SCH_S   InMemTest2

XEvent .NET-Namespaces und C#XEvent .NET namespaces and C#

Package0 weist zwei weitere Ziele auf, die aber in Transact-SQL nicht verwendet werden können:Package0 has two more targets, but they cannot be used in Transact-SQL:

  • compressed_historycompressed_history
  • event_streamevent_stream

Ein Grund, warum wir wissen, dass diese beiden Ziele in T-SQL nicht verwendet werden können, besteht darin, dass ihre Werte ungleich NULL in der Spalte sys.dm_xe_objects.capabilities das 0x1-Bit nicht enthalten.One way we know those two targets cannot be used in T-SQL is that their non-null values in the column sys.dm_xe_objects.capabilities do not include the bit 0x1.

Das event_stream-Ziel kann in .NET-Programmen verwendet werden, die in Sprachen wie C# erstellt wurden.The event_stream target can be used in .NET programs written in languages like C#. C#- und andere .NET-Entwickler können auf einen Ereignisstream mithilfe einer .NET Framework-Klasse zugreifen, wie etwa im Namespace Microsoft.SqlServer.XEvents.Linq.C# and other .NET developers can access an event stream through a .NET Framework class, such as in namespace Microsoft.SqlServer.XEvents.Linq.

Wenn er auftritt, bedeutet Fehler 25726 , dass der Ereignisstream sich schneller mit Daten gefüllt hat, als der Client die Daten nutzen konnte.If encountered, error 25726 means the event stream filled up with data faster than the client could consume the data. Dadurch wurde die Verbindung der Datenbank-Engine mit dem Ereignisstream getrennt, um eine Beeinträchtigung der Serverleistung zu vermeiden.This caused the database engine to disconnect from the event stream to avoid slowing the performance of the server.

XEvent-NamespacesXEvent namespaces