Ziele für erweiterte Ereignisse

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

Dieser Artikel erläutert Zweck und Art der Verwendung von Zielen für erweiterte Ereignisse. Der vorliegende Artikel erläutert für jedes Ziel:

  • dessen Fähigkeiten im Sammeln und Melden der von Ereignissen gesendeten Daten
  • dessen Parameter, es sei denn, der Parameter ist selbsterklärend

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 Nr. No
event_counter Ja Ja Ja
event_file Ja Ja Ja
event_stream Ja Ja Ja
histogram Ja Ja Ja
pair_matching Ja Nr. No
ring_buffer Ja Ja Ja

Voraussetzungen

Um diesen Artikel optimal zu nutzen, sollten Sie:

Parameter, Aktionen und Felder

Die Anweisung CREATE EVENT SESSION spielt die zentrale Rolle bei erweiterten Ereignissen. Zum Schreiben der Anweisung benötigen Sie Folgendes:

  • Die Ereignisse, die Sie der Sitzung hinzufügen möchten
  • Die dem ausgewählten Ereignis zugeordneten Felder
  • 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, können aus dem folgenden Artikel in Abschnitt C kopiert werden:

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

Erweiterte Ereignisse in SQL Server können mit der Ereignisablaufverfolgung für Windows (Event Tracing for Windows, ETW) zusammenwirken, um die Systemaktivität zu überwachen. Weitere Informationen finden Sie unter:

Dieses ETW-Ziel verarbeitet die empfangenen Daten synchron , während die meisten Ziele eine asynchrone Verarbeitung aufweisen.

Hinweis

Das etw_classic_sync_target Ziel wird von Azure SQL-Datenbank und Azure SQL Managed Instance nicht unterstützt: Alternativ können Sie das event_file Ziel auch mit formlosen Objekten 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 es synchron empfängt.

Von event_counter Ziel erfasste Beispielausgabe

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

Als Nächstes erfolgt 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 formloses Objekt in Azure Storage:

  • Sie geben den filename Parameter in der ADD TARGET Klausel an. Die Dateierweiterung muss xel lauten.
  • 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.

Hinweis

Azure SQL Managed Instance und Azure SQL-Datenbank erscheint in Azure Storage nur als Wert des filename Parameters.

Ein event_fileCodebeispiel für event_file für SQL-Datenbank oder SQL Managed Instance finden Sie unter Code des Ereignisdateiziels für erweiterte Ereignisse in SQL-Datenbank.

CREATE EVENT SESSION mit event_file

Hier ist ein Beispiel für 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_fileevent_file-Ziel speichert die empfangenen Daten in einem binären Format, das für Menschen 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 SELECT Anweisung ä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 SELECT Anweisung ähnlich dem folgenden Beispiel. Nach SQL Server 2014 werden keine xem Dateien 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 die * Wildcard 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 Berechtigungen Read und List für den Container mit den xel formlosen Objekten 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 Managed Instance können Sie die sys.fn_xe_file_target_read_file() Funktion aufrufen, nachdem Sie eine Serveranmeldeinformation mit einem SAS-Token mit den Berechtigungen Read und List für den Container mit den xel formlosen Objekten 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 Namenpräfix für formlose Objekte anstelle des vollständigen Namens im ersten Argument von sys.fn_xe_file_target_read_file() angeben, gibt die Funktion Daten aus allen formlosen Objekten im Container zurück, die dem Präfix entsprechen. Auf diese Weise können Sie Daten aus allen Rollover-Dateien einer bestimmten Ereignissitzung abrufen, ohne die * von Azure Storage unterstützten Wildcard zu verwenden.

In den vorherigen Azure SQL-Beispielen wird die xel Erweiterung weggelassen, um alle Rollover-Dateien 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 von sys.fn_xe_file_target_read_file in 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:

  • Vorkommen für mehrere Elemente separat zählen
  • Vorkommen von verschiedenen Elementtypen zählen
    • Ereignisfelder
    • Aktionen

Das histogram Ziel verarbeitet die Daten, die es synchron empfängt.

Dersource_type Parameter bildet den Schlüssel bei der Steuerung des histogram-Ziels:

  • 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 Standardwert des Parameters slots ist 256. Wenn Sie einen anderen Wert zuweisen, wird der Wert auf die nächste Potenz von 2 aufgerundet. Beispielsweise würde „slots=59“ auf „64“ aufgerundet. Die maximale Anzahl der Histogrammplätze für ein histogram Ziel beträgt 16.384.

Wenn Sie histogram für das Ziel verwenden, werden möglicherweise 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 jedoch ein Hashkonflikt auftritt, wird ein Ereignis, das in einem Slot gezählt werden soll, 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, bei der histogram als Ziel- und Gruppierungsvorgang von 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 beider 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 Histogramm-Slots fest, die höher als das Quadrat der erwarteten unterschiedlichen Werte sind. Wenn das histogram Ziel beispielsweise auf das table_name Ereignisfeld von source festgelegt ist 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 Slots in diesem Beispiel ist.

Histogramm-Ziel mit einer Aktion

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

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 histogramHistogramm-Ziel zu verwenden. Daher ist eine neue Ereignissitzung erforderlich, um zusätzliche Aktionsfelder oder Ereignisfelder in einem neuen histogramHistogramm-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 SELECT Anweisung kann die Aktionen finden, die Ihnen im System zur Angabe in Ihrer CREATE EVENT SESSION Anweisung zur Verfügung stehen. In der WHERE Klausel müssten Sie dazu zuerst den o.name LIKE Filter bearbeiten, sodass er den Aktionen entspricht, die Sie interessieren.

Hier sehen Sie ein Beispiel-Rowset, das von der C.3 SELECT Anweisung zurückgegeben wird. Die system_thread_id Aktion befindet sich in der zweiten Zeile.

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

Histogramm-Ziel mit einem Ereignisfeld

Im folgenden Beispiel wird source_type=0 festgelegt. Der source zugewiesene 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 histogramHistogramm-Ziel erfasst. Die Daten zeigen, dass in der Datenbank mit ID=5 7 checkpoint_begin Ereignisse aufgetreten sind.

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 SELECT Anweisung zeigt Ereignisfelder an, unter denen Sie wählen können. Sie müssten hier zunächst den o.name LIKE Filter bearbeiten, um ihn auf den Namen des ausgewählten Ereignisses festzulegen.

Das folgende Rowset wurde von C.4 SELECT zurückgegeben. Das Rowset zeigt, dass database_id das einzige Feld des checkpoint_begin Ereignisses ist, 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

Mithilfe des pair_matching Ziels können Sie aufgetretene Startereignisse ermitteln, denen kein Endeereignis entspricht. Es kann beispielsweise auf ein Problem hinweisen, wenn ein lock_acquired Ereignis eintritt, dem kein entsprechendes lock_released Ereignis in angemessener Zeit folgt.

Das System ordnet Start- und Endeereignisse nicht automatisch zu. Vielmehr müssen Sie dem System die Zuordnung mithilfe Ihrer CREATE EVENT SESSION Anweisung erläutern. Wenn ein Start- und ein Endeereignis zugeordnet wurden, wird das Paar verworfen, damit man sich ganz auf die nicht zugeordneten Startereignisse konzentrieren kann.

Suchen von zuzuordnenden Feldern für das Start- und Endeereignispaar

Mithilfe von C.4 SELECT sehen wir im folgenden Rowset, dass etwa 16 Felder für das lock_acquired Ereignis vorhanden sind. Das hier angezeigte Rowset wurde manuell geteilt, um zu zeigen, welche Felder in unserem Beispiel zugeordnet wurden. Bei einigen Feldern wie duration ist der Versuch, eine Übereinstimmung zu erzielen, 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 Mengen von Feldern für die Zuordnung der Ereignisse zu Paaren an. Die Abfolge von durch Trennzeichen getrennte Felder, die begin_matching_columns und end_matching_columns zugewiesen sind, müssen identisch sein. Zwischen den durch Trennzeichen getrennten Feldern sind keine Tabstopp- oder Zeilenvorschubzeichen zulässig, jedoch Leerzeichen.

Um die Ergebnisse einzuschränken, die wir zuerst von sys.objects ausgewählt haben, um die object_id unserer Testtabelle zu ermitteln. 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
    );

Zum Testen der Ereignissitzung haben wir absichtlich die Freigabe von zwei erworbenen Sperren verhindert. Dies haben wir mit den folgenden T-SQL-Schritten erreicht:

  1. BEGIN TRANSACTION.
  2. UPDATE MyTable....
  3. Absichtlich nicht ein COMMIT TRANSACTION erstellen, bis wir die Ziele untersucht haben.
  4. Später nach dem Testen haben wir eine COMMIT TRANSACTION erstellt.

Das einfache event_counter Ziel hat die folgenden Ausgabezeilen bereitgestellt. Da 52-50=2, erfahren wir aus der Ausgabe, dass wir 2 nicht gepaarte lock_acquired-Ereignisse sehen, wenn wir die Ausgabe aus dem pair-matching-Ziel 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 zwei Zeilen überhaupt finden, bedeutet, dass diese zwei lock_acquired Ereignisse nicht gepaart wurden.

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 zeigen wir Ihnen außerdem, wie Sie XQuery verwenden können, um den XML-Darstellung von ring_buffer-Inhalten in ein besser lesbares relationales Rowset zu kopieren.

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 ist MAX_MEMORY für ein ring_buffer Ziel in SQL Server nicht beschränkt und auf 32 MB in Azure SQL-Datenbank und Azure SQL Managed Instance 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">

Erstellen einer Sitzung 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
    );

Für lock_acquired von ring_buffer-Ziel empfangene XML-Ausgabe

Beim Abrufen durch eine SELECT Anweisung wird der Inhalt eines Ringpuffers als XML-Dokument dargestellt. Im Folgenden wird ein Beispiel gezeigt: Aus Platzgründen wurden jedoch alle außer zwei <event> Elemente entfernt. Außerdem wurden innerhalb jedes <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 vorstehenden XML-Code anzuzeigen, können Sie die folgende SELECT Anweisung ausgeben, während die Ereignissitzung aktiv ist. Die XML-Daten werden aus der Systemansicht sys.dm_xe_session_targets abgerufen.

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 vorstehenden XML-Code als relationales Rowset darzustellen, fahren Sie nach der vorstehenden SELECT Anweisung durch Ausgeben der folgenden T-SQL-Anweisung fort. 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= Wert des Attributs auf dem <event> Element.
  • Das '(...)[1]' Konstrukt stellt sicher, dass pro Iteration nur ein Wert zurückgegeben wird, da dies eine erforderliche Einschränkung der .value() XQuery-Methode für Variablen und Spalten vom XML-Datentyp darstellt.

(B)

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

(C)

  • Der innere Wert des Elements von <value> innerhalb eines <data> Elements, das seinen Namen= Attribut hat, das transaction_id gleich ist.

(D)

  • <event> enthält <action>.
  • <action> mit Name=Attribut gleich database_name, und Paket=Attribut gleich sqlserver (nicht package0), dann erhalten Sie den inneren Wert von <value> Element.

(E)

  • CROSS APPLYbewirkt die Wiederholung der Verarbeitung für jedes einzelne <event> Element, dessen name Attribut gleich lock_acquired ist.
  • Dies gilt für den von der vorherigen FROM Klausel zurückgegebenen XML-Code.

Ausgabe von XQuery SELECT

Die nächste Abbildung zeigt das vom vorhergehenden T-SQL, des XQuery enthält, generierte Rowset.

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 in .NET-Programmen nur verwendet werden, die in Sprachen wie C# erstellt 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 Fehler 25726 auftritt, 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. wenn aus dem event_stream Ziel gelesen wird, bedeutet dies, dass der Ereignisstream sich schneller mit Daten gefüllt hat, als der Client die Daten nutzen konnte. Dadurch wurde die Verbindung der Datenbank-Engine mit dem Ereignisstream getrennt, um eine Beeinträchtigung von Datenbank-Engine zu vermeiden.

XEvent-Namespaces