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:
Machen Sie sich mit den Grundlagen erweiterter Ereignisse vertraut, wie in der Schnellstartanleitung beschrieben: Erweiterte Ereignisse.
Sie haben eine aktuelle Version von SQL Server Management Studio (SSMS) installiert. Weitere Informationen finden Sie unter Herunterladen von SQL Server Management Studio (SSMS).
In SSMS wissen Sie, wie Sie Objekt-Explorer verwenden, um mit der rechten Maustaste auf den Zielknoten unter Ihrer Ereignissitzung zu klicken, um die Ausgabedaten einfach anzuzeigen.
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:
- Ereignisablaufverfolgung für Windows-Ziel
- Überwachen der Systemaktivität mit erweiterten Ereignissen
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 derADD TARGET
Klausel an. Die Dateierweiterung muss seinxel
. - 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-1
zu 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 Gruppierungsvorgangobject_id
verwendet 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=1
an. 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 SELECT
zurü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 SELECT
zurü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 duration
dem 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:
BEGIN TRANSACTION
.UPDATE MyTable...
.- Absichtlich erst dann ein
COMMIT TRANSACTION
, nachdem wir die Ziele untersucht haben. - 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 1
festgelegt 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_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 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, dasmode
gleich ist.
(C)
<value>
element inner value, within a<data>
element, which has its name= attribute equal totransaction_id
.
(D)
<event>
enthält<action>
.<action>
having name= attribute equal todatabase_name
, and package= attribute equal tosqlserver
(notpackage0
), get the inner value of<value>
element.
(E)
CROSS APPLY
bewirkt, dass die Verarbeitung für jedes einzelne<event>
Element wiederholt wird, das dasname
Attribut hat, das gleich istlock_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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für