Ziele für erweiterte Ereignisse

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

In diesem Artikel wird erläutert, wann und wie Erweiterte Ereignisse verwendet werden. Der vorliegende Artikel erläutert für jedes Ziel:

  • Seine Fähigkeiten beim Sammeln und Melden der von Ereignissen gesendeten Daten
  • Seine Parameter, außer wenn der Parameter selbsterklärend ist

In der folgenden Tabelle wird die Verfügbarkeit jedes Zieltyps in verschiedenen Datenbankmodulen beschrieben.

Zieltyp SQL Server Azure SQL-Datenbank Verwaltete Azure SQL-Datenbank-Instanz
etw_classic_sync_target Ja Nein Nein
event_counter Ja Ja Ja
event_file Ja Ja Ja
event_stream Ja Ja Ja
Histogramm Ja Ja Ja
pair_matching Ja Nein Nein
ring_buffer Ja Ja Ja

Voraussetzungen

Um diesen Artikel optimal zu nutzen, sollten Sie:

Parameter, Aktionen und Felder

Die CREATE EVENT SESSION-Anweisung ist für erweiterte Ereignisse zentral. Zum Schreiben der Anweisung benötigen Sie Folgendes:

  • Die Ereignisse, die Sie der Sitzung hinzufügen möchten
  • Die felder, die den einzelnen ausgewählten Ereignissen zugeordnet sind
  • Die Parameter, die den einzelnen Zielen zugeordnet sind, die Sie den Sitzungen hinzufügen möchten

SELECT-Anweisungen, die solche Listen aus Systemansichten zurückgeben, stehen in ihrem Abschnitt C zum Kopieren aus dem folgenden Artikel zur Verfügung:

Sie können Parameter, Felder und Aktionen sehen, die im Kontext einer tatsächlichen CREATE EVENT SESSION Anweisung verwendet werden, aus Abschnitt B2 (T-SQL-Perspektive).

etw_classic_sync_target-Ziel

In SQL Server können erweiterte Ereignisse mit der Ereignisablaufverfolgung für Windows (ETW) zusammenarbeiten, um die Systemaktivität zu überwachen. Weitere Informationen finden Sie unter:

Dieses ETW-Ziel verarbeitet die daten, die er synchron empfängt, während die meisten Ziele asynchron verarbeitet werden.

Hinweis

Azure SQL verwaltete Instanz und Azure SQL-Datenbank unterstützen das etw_classic_sync_target Ziel nicht. Alternativ können Sie das event_file Ziel auch mit blobs verwenden, die in Azure Storage gespeichert sind.

event_counter-Ziel

Das event_counter Ziel zählt, wie oft jedes angegebene Ereignis auftritt.

Im Gegensatz zu den meisten anderen Zielen:

  • Das event_counter Ziel hat keine Parameter.
  • Das event_counter Ziel verarbeitet die daten, die er synchron empfängt.

Beispielausgabe, die vom event_counter Ziel erfasst wird

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

Als Nächstes ist die CREATE EVENT SESSION Anweisung, die die vorherigen Ergebnisse zurückgegeben hat. In diesem Beispiel wurde das package0.counter Feld im WHERE Klauseln-Prädikat verwendet, um die Zählung zu beenden, nachdem die Anzahl 4 erreicht hat.

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-Ziel

Das event_file Ziel schreibt die Ereignissitzungsausgabe aus dem Puffer in eine Datenträgerdatei oder in ein Blob in Azure Storage:

  • Sie geben den filename Parameter in der ADD TARGET Klausel an. Die Dateierweiterung muss sein xel.
  • Der von Ihnen ausgewählte Dateiname wird vom System als Präfix verwendet, an das eine datumsbasierte lange ganze Zahl angefügt wird, gefolgt von der xel Erweiterung.

Hinweis

Azure SQL verwaltete Instanz und Azure SQL-Datenbank nur Blobs in Azure Storage als Wert des filename Parameters.

Ein event_file Codebeispiel für SQL-Datenbank- oder SQL-verwaltete Instanz finden Sie unter Ereignisdateizielcode für erweiterte Ereignisse in SQL-Datenbank.

CREATE EVENT SESSION mit event_file

Hier ist ein Beispiel für die CREATE EVENT SESSION Mit einer ADD TARGET Klausel, die ein event_file Ziel hinzufügt.

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:\temp\locks_acq_rel_eventfile_22-.xel'
    )
    WITH
    (
        MAX_MEMORY=4096 KB,
        MAX_DISPATCH_LATENCY=10 SECONDS
    );

sys.fn_xe_file_target_read_file()-Funktion

Das event_file Ziel speichert die empfangenen Daten in einem binärformat, das nicht lesbar ist. Mit der funktion sys.fn_xe_file_target_read_file können Sie den Inhalt einer xel Datei als relationales Rowset darstellen.

Verwenden Sie für SQL Server 2016 und höhere Versionen eine Anweisung SELECT ähnlich dem folgenden Beispiel.

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

Verwenden Sie für SQL Server 2014 eine Anweisung SELECT ähnlich dem folgenden Beispiel. Nach SQL Server 2014 werden die xem Dateien nicht mehr verwendet.

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

In beiden Beispielen wird das * Wild Karte verwendet, um alle xel Dateien zu lesen, die mit dem angegebenen Präfix beginnen.

In Azure SQL-Datenbank können Sie die sys.fn_xe_file_target_read_file() Funktion aufrufen, nachdem Sie eine datenbankbezogene Anmeldeinformationen erstellt haben, die ein SAS-Token mit den Read Berechtigungen List für den Container mit den xel BLOBs enthalten:

/*
Create a master key to protect the secret of the credential
*/
IF NOT EXISTS (
    SELECT 1
    FROM sys.symmetric_keys
    WHERE name = '##MS_DatabaseMasterKey##'
)
CREATE MASTER KEY;

/*
(Re-)create a database scoped credential.
The name of the credential must match the URI of the blob container.
*/
IF EXISTS (
    SELECT *
    FROM sys.database_credentials
    WHERE name = 'https://exampleaccount4xe.blob.core.windows.net/extended-events-container'
)
DROP DATABASE SCOPED CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container];

/*
The secret is the SAS token for the container. The Read and List permissions are set.
*/
CREATE DATABASE SCOPED CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = 'sp=rl&st=2023-10-09T22:12:54Z&se=2023-10-10T06:12:54Z&spr=https&sv=2022-11-02&sr=c&sig=REDACTED';

/*
Return event session data
*/
SELECT f.*
--,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
FROM sys.fn_xe_file_target_read_file('https://exampleaccount4xe.blob.core.windows.net/extended-events-container/event-session-1', DEFAULT, DEFAULT, DEFAULT) AS f;

In Azure SQL verwaltete Instanz können Sie die sys.fn_xe_file_target_read_file() Funktion aufrufen, nachdem Sie eine Serveranmeldeinformation mit einem SAS-Token mit den Read Berechtigungen List für den Container mit den xel BLOBs erstellt haben:

IF NOT EXISTS (
    SELECT 1
    FROM sys.symmetric_keys
    WHERE name = '##MS_DatabaseMasterKey##'
)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'REDACTED';

/*
(Re-)create a database scoped credential.
The name of the credential must match the URI of the blob container.
*/
IF EXISTS (
    SELECT *
    FROM sys.credentials
    WHERE name = 'https://exampleaccount4xe.blob.core.windows.net/extended-events-container'
)
DROP CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container];

/*
The secret is the SAS token for the container. The Read and List permissions are set.
*/
CREATE CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = 'sp=rl&st=2023-10-09T22:12:54Z&se=2023-10-10T06:12:54Z&spr=https&sv=2022-11-02&sr=c&sig=REDACTED';

/*
Return event session data
*/
SELECT f.*
--,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
FROM sys.fn_xe_file_target_read_file('https://exampleaccount4xe.blob.core.windows.net/extended-events-container/event-session-1', DEFAULT, DEFAULT, DEFAULT) AS f;

Tipp

Wenn Sie ein Blobnamenpräfix anstelle des vollständigen Blobnamens im ersten Argument angeben sys.fn_xe_file_target_read_file(), gibt die Funktion Daten aus allen Blobs im Container zurück, die dem Präfix entsprechen. Auf diese Weise können Sie Daten aus allen Rolloverdateien einer bestimmten Ereignissitzung abrufen, ohne die * Wild Karte zu verwenden, die von Azure Storage nicht unterstützt wird.

In den vorherigen Azure SQL-Beispielen wird die xel Erweiterung weggelassen, um alle Rolloverdateien für eine Sitzung mit dem Namen event-session-1zu lesen.

Im event_file-Ziel gespeicherte Daten

Dies ist ein Beispiel für Daten, die in sys.fn_xe_file_target_read_file SQL Server 2016 (13.x) und höheren Versionen zurückgegeben werden.

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:\temp\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:\temp\locks_acq_rel_eventfile_22-_0_131150744126230000.xel   11776

histogram-Ziel

Das histogram Ziel kann:

  • Zählen von Vorkommen für mehrere Elemente separat
  • Zählen von Vorkommen verschiedener Elementtypen:
    • Ereignisfelder
    • Aktionen

Das histogram Ziel verarbeitet die daten, die er synchron empfängt.

Der source_type Parameter ist der Schlüssel zum Steuern des Histogrammziels:

  • source_type=0: Sammeln von Daten für ein Ereignisfeld.
  • source_type=1: Sammeln von Daten für eine Aktion. Dies ist die Standardeinstellung.

Der slots Parameterstandard ist 256. Wenn Sie einen anderen Wert zuweisen, wird der Wert auf die nächste Potenz von 2 aufgerundet. So würden z. B. Slots=59 auf 64 aufgerundet. Die maximale Anzahl der Histogrammplätze für ein histogram Ziel beträgt 16384.

Wenn Sie das Ziel verwenden histogram , werden manchmal unerwartete Ergebnisse angezeigt. Einige Ereignisse werden möglicherweise nicht in den erwarteten Slots angezeigt, während andere Slots möglicherweise eine höhere als erwartete Anzahl von Ereignissen anzeigen.

Dies kann passieren, wenn beim Zuweisen von Ereignissen zu Slots ein Hashkonflikt auftritt. Dies ist zwar selten, wenn ein Hashkonflikt auftritt, ein Ereignis, das in einem Steckplatz gezählt werden soll, wird in einem anderen gezählt. Aus diesem Grund sollte darauf geachtet werden, dass ein Ereignis nicht nur auftritt, weil die Anzahl in einem bestimmten Slot als Null angezeigt wird.

Betrachten Sie beispielsweise das folgende Szenario:

  • Sie richten eine erweiterte Ereignissitzung ein, die histogram als Ziel- und Gruppierungsvorgang object_idverwendet wird, um die Ausführung gespeicherter Prozeduren zu erfassen.
  • Sie führen die gespeicherte Prozedur A aus. Anschließend führen Sie die gespeicherte Prozedur B aus.

Wenn die Hashfunktion denselben Wert für die object_id beiden gespeicherten Prozeduren zurückgibt, zeigt das Histogramm die gespeicherte Prozedur A an, die zweimal ausgeführt wird, und die gespeicherte Prozedur B wird nicht angezeigt.

Um dieses Problem zu beheben, wenn die Anzahl der unterschiedlichen Werte relativ klein ist, legen Sie die Anzahl der Histogrammplätze fest, die höher als das Quadrat der erwarteten unterschiedlichen Werte sind. Wenn das histogram Ziel beispielsweise auf das table_name Ereignisfeld festgelegt ist source und 20 Tabellen in der Datenbank vorhanden sind, dann 20*20 = 400. Die nächste Potenz von 2 größer als 400 ist 512, was die empfohlene Anzahl von Steckplätzen in diesem Beispiel ist.

Histogrammziel mit einer Aktion

In der ADD TARGET ... (SET ...) Klausel gibt die folgende CREATE EVENT SESSION Anweisung die Zielparameterzuweisung source_type=1an. Dies bedeutet, dass das Histogrammziel eine Aktion verfolgt.

Im vorliegenden Beispiel wird in der ADD EVENT ... (ACTION ...) Klausel nur eine aktion zum Auswählen angeboten, nämlich sqlos.system_thread_id. In der ADD TARGET ... (SET ...) Klausel wird die Zuordnung source=N'sqlos.system_thread_id'angezeigt.

Hinweis

Es ist nicht möglich, pro Ereignissitzung mehr als ein Ziel desselben Typs hinzuzufügen. Dies schließt das histogram Ziel ein. Es ist auch nicht möglich, mehr als eine Quelle (Aktions-/Ereignisfeld) pro histogram Ziel zu haben. Daher ist eine neue Ereignissitzung erforderlich, um alle zusätzlichen Aktionen oder Ereignisfelder in einem separaten histogram Ziel nachzuverfolgen.

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

Die folgenden Daten wurden erfasst. Die Werte in der value Spalte sind system_thread_id Werte. Beispielsweise wurden im Thread 6540 insgesamt 236 Sperren in Anspruch genommen.

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

Verwenden von SELECT zum Entdecken der verfügbaren Aktionen

Die C.3-AnweisungSELECT kann die Aktionen finden, die das System für Sie in der CREATE EVENT SESSION Anweisung angeben kann. In der WHERE Klausel würden Sie zuerst den o.name LIKE Filter bearbeiten, um den Aktionen zu entsprechen, die Sie interessieren.

Als Nächstes ist ein Beispiel-Rowset, das von C.3 SELECTzurückgegeben wird. Die system_thread_id Aktion wird in der zweiten Zeile angezeigt.

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

Histogrammziel mit einem Ereignisfeld

Im folgenden Beispiel wird source_type=0 festgelegt. Der zugewiesene source Wert ist ein Ereignisfeld.

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

Die folgenden Daten wurden vom histogram Ziel erfasst. Die Daten zeigen, dass die Datenbank mit ID 5 erfahrene 7-Ereignisse checkpoint_begin .

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

Verwenden von SELECT zum Ermitteln der für das ausgewählte Ereignis verfügbaren Felder

Die C.4-AnweisungSELECT zeigt Ereignisfelder an, aus denen Sie auswählen können. Sie würden zuerst den o.name LIKE Filter so bearbeiten, dass er der ausgewählte Ereignisname ist.

Das folgende Rowset wurde vom C.4 SELECTzurückgegeben. Das Rowset zeigt, dass database_id es sich um das einzige Feld des checkpoint_begin Ereignisses handelt, das Werte für das histogram Ziel bereitstellen kann.

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

pair_matching-Ziel

Mit dem pair_matching Ziel können Sie Startereignisse erkennen, die ohne ein entsprechendes Endereignis auftreten. Es kann z. B. ein Problem sein, wenn ein lock_acquired Ereignis auftritt, aber kein übereinstimmende lock_released Ereignis rechtzeitig folgt.

Das System stimmt nicht automatisch mit Start- und Endereignissen überein. Stattdessen erklären Sie den Abgleich mit dem System in Ihrer CREATE EVENT SESSION Anweisung. Wenn ein Start- und Endereignis übereinstimmen, wird das Paar nicht Karte um sich auf die nicht übereinstimmenden Startereignisse zu konzentrieren.

Suchen nach übereinstimmenden Feldern für das Start- und Endereignispaar

Mithilfe der C.4 SELECT sehen wir im folgenden Rowset etwa 16 Felder für das lock_acquired Ereignis. Das hier angezeigte Rowset wurde manuell geteilt, um zu zeigen, welche Felder in unserem Beispiel zugeordnet wurden. Bei einigen Feldern wie durationdem Versuch, eine Übereinstimmung zu erzielen, ist bedeutungslos.

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

Ein Beispiel für das pair_matching Ziel

Die folgende CREATE EVENT SESSION Anweisung gibt zwei Ereignisse und zwei Ziele an. Das pair_matching Ziel gibt zwei Sätze von Feldern an, die mit den Ereignissen in Paaren übereinstimmen sollen. Die Abfolge von durch Trennzeichen getrennten Feldern, die zugewiesen begin_matching_columns sind und end_matching_columns identisch sein müssen. Es sind keine Tabstopps oder Newlines zwischen den Feldern zulässig, die im durch Trennzeichen getrennten Wert Erwähnung, obwohl Leerzeichen zulässig sind.

Um die Ergebnisse einzugrenzen, haben wir zuerst ausgewählt sys.objects , um die object_id Testtabelle zu finden. Wir haben einen Filter für diese eine Objekt-ID in der ADD EVENT ... (WHERE ...) Klausel hinzugefügt.

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

Um die Ereignissitzung zu testen, haben wir absichtlich verhindert, dass zwei erworbene Sperren freigegeben werden. Dies haben wir mit den folgenden T-SQL-Schritten erreicht:

  1. BEGIN TRANSACTION.
  2. UPDATE MyTable....
  3. Absichtlich erst dann ein COMMIT TRANSACTION, nachdem wir die Ziele untersucht haben.
  4. Später nach dem Testen haben wir eine COMMIT TRANSACTION.

Das einfache event_counter Ziel hat die folgenden Ausgabezeilen bereitgestellt. Da 52-50=2, bedeutet die Ausgabe, dass 2 entkoppelte lock_acquired Ereignisse angezeigt werden, wenn wir die Ausgabe aus dem Paarabgleichsziel untersuchen.

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

Das pair_matching Ziel hat die folgende Ausgabe bereitgestellt. Wie von der event_counter Ausgabe vorgeschlagen, sehen wir tatsächlich die beiden lock_acquired Zeilen. Die Tatsache, dass wir diese Zeilen überhaupt sehen, bedeutet, dass diese beiden lock_acquired Ereignisse entkoppelt sind.

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 entkoppelten lock_acquired Ereignisse können den T-SQL-Text enthalten, der von der sqlserver.sql_text Aktion bereitgestellt wird. Dadurch wird die Abfrage erfasst, die die Sperren abgerufen hat.

ring_buffer-Ziel

Das ring_buffer Ziel eignet sich nur für eine schnelle und einfache Ereignissammlung im Arbeitsspeicher. Beim Beenden der Ereignissitzung wird die gespeicherte Ausgabe verworfen.

In diesem Abschnitt wird auch gezeigt, wie Sie XQuery verwenden können, um die XML-Darstellung des Ringpufferinhalts in ein besser lesbares relationales Rowset zu konvertieren.

Tipp

Wenn Sie ein ring_buffer Ziel hinzufügen, legen Sie den MAX_MEMORY Parameter auf 1024 KB oder weniger fest. Durch die Verwendung größerer Werte kann der Speicherverbrauch unnötig erhöht werden.

Standardmäßig MAX_MEMORY ist ein ring_buffer Ziel in SQL Server nicht beschränkt und auf 32 MB in Azure SQL-Datenbank und Azure SQL verwaltete Instanz beschränkt.

Sie nutzen Daten aus einem ring_buffer Ziel, indem Sie sie in XML konvertieren, wie im folgenden Beispiel gezeigt. Während dieser Konvertierung werden alle Daten, die nicht in ein 4-MB-XML-Dokument passen, weggelassen. Selbst wenn Sie mehr Ereignisse im Ringpuffer erfassen, indem Sie größere MAX_MEMORY Werte verwenden (oder diesen Parameter bei seinem Standardwert verlassen), können Sie möglicherweise nicht alle Ereignisse nutzen, da die XML-Dokumentgröße auf 4 MB beschränkt ist, wobei der Aufwand von XML-Markup und Unicode-Zeichenfolgen berücksichtigt wird.

Sie wissen, dass der Inhalt des Ringpuffers während der Konvertierung in XML ausgelassen wird, wenn das truncated Attribut im XML-Dokument auf 1festgelegt ist, z. B.:

<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">

CREATE EVENT SESSION mit einem ring_buffer Ziel

Hier ist ein Beispiel für das Erstellen einer Ereignissitzung mit einem ring_buffer Ziel. In diesem Beispiel wird der MAX_MEMORY Parameter zweimal angezeigt: einmal, um den ring_buffer Zielspeicher auf 1024 KB festzulegen, und einmal, um den Ereignissitzungspufferspeicher auf 2 MB festzulegen.

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,
            MAX_MEMORY = 1024
    )
    WITH
    (
        MAX_MEMORY = 2 MB,
        MAX_DISPATCH_LATENCY = 3 SECONDS
    );

Vom ring_buffer Ziel empfangene XML-Ausgabe für lock_acquired

Beim Abrufen durch eine SELECT Anweisung wird der Inhalt eines Ringpuffers als XML-Dokument dargestellt. Als Nächstes wird ein Beispiel gezeigt. Aus Platzgründen wurden jedoch alle, aber zwei <event> Elemente entfernt. Außerdem wurden innerhalb jedes Elements <event>auch eine Handvoll <data> Elemente entfernt.

<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 vorherigen XML-Code anzuzeigen, können Sie Folgendes SELECT ausgeben, während die Ereignissitzung aktiv ist. Die XML-Daten werden aus der Systemansicht sys.dm_xe_session_targetsabgerufen.

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
    INNER 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 Rowset

Um den vorherigen XML-Code als relationales Rowset anzuzeigen, fahren Sie mit der vorherigen SELECT Anweisung fort, indem Sie die folgende T-SQL-Anweisung ausgeben. In den kommentierten Zeilen ist jede Verwendung von XQuery erläutert.

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 #XmlAsTable
CROSS APPLY
    -- (E)
    TargetDateAsXml.nodes('/RingBufferTarget/event[@name="lock_acquired"]') AS T(ObjectLocks);

XQuery-Anmerkungen zur vorstehenden SELECT-Anweisung

(A)

  • timestamp= Attributwert für <event> Element.
  • Das '(...)[1]' Konstrukt stellt sicher, dass pro Iteration nur ein Wert zurückgegeben wird, wie eine erforderliche Einschränkung der .value() XQuery-Methode von XML-Datentypvariablen und -spalten.

(B)

  • <text> Der innere Wert des Elements innerhalb eines <data> Elements, das seinen Namen= Attribut hat, das modegleich ist.

(C)

  • <value> element inner value, within a <data> element, which has its name= attribute equal to transaction_id.

(D)

  • <event> enthält <action>.
  • <action> having name= attribute equal to database_name, and package= attribute equal to sqlserver (not package0), get the inner value of <value> element.

(E)

  • CROSS APPLY bewirkt, dass die Verarbeitung für jedes einzelne <event> Element wiederholt wird, das das name Attribut hat, das gleich ist lock_acquired.
  • Dies gilt für den xml-Code, der von der vorherigen FROM Klausel zurückgegeben wird.

Ausgabe von XQuery SELECT

Als Nächstes ist das rowset, das von dem vorherigen T-SQL generiert wird, das XQuery enthält.

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

event_stream Ziel

Das event_stream Ziel kann nur in .NET-Programmen verwendet werden, die in Sprachen wie C# geschrieben wurden. C# und andere .NET-Entwickler können über .NET Framework-Klassen im Microsoft.SqlServer.XEvents.Linq Namespace auf einen Ereignisdatenstrom zugreifen. Dieses Ziel kann in T-SQL nicht verwendet werden.

Wenn beim Lesen aus dem event_stream Ziel Fehler 25726 The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. auftritt, bedeutet dies, dass der Ereignisdatenstrom schneller mit Daten gefüllt ist, als der Client die Daten nutzen könnte. Dies bewirkt, dass der Datenbank-Engine die Verbindung mit dem Ereignisdatenstrom trennt, um auswirkungen auf Datenbank-Engine Leistung zu vermeiden.

XEvent-Namespaces