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:
Allgemeine Kenntnisse der Grundlagen von erweiterten Ereignissen haben, wie in Schnellstart: Erweiterte Ereignisse beschrieben.
Die aktuelle Version von SQL Server Management Studio (SSMS) installiert haben. Weitere Informationen finden Sie unter Herunterladen von SQL Server Management Studio (SSMS).
In SSMS sollte die Verwendung des Objekt-Explorers bekannt sein, um mit der rechten Maustaste auf den Zielknoten für die Ereignissitzung zu klicken, um die bequeme Anzeige der Ausgabedaten zu erreichen.
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:
- Ereignisablaufverfolgung für Windows-Ziel
- Überwachen der Systemaktivität mit erweiterten Ereignissen
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 derADD TARGET
Klausel an. Die Dateierweiterung mussxel
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_file
Codebeispiel 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_file
event_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-1
zu 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 vonobject_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
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 histogram
Histogramm-Ziel zu verwenden. Daher ist eine neue Ereignissitzung erforderlich, um zusätzliche Aktionsfelder oder Ereignisfelder in einem neuen histogram
Histogramm-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 histogram
Histogramm-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:
BEGIN TRANSACTION
.UPDATE MyTable...
.- Absichtlich nicht ein
COMMIT TRANSACTION
erstellen, bis wir die Ziele untersucht haben. - 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 1
festgelegt 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, dasmode
gleich ist.
(C)
- Der innere Wert des Elements von
<value>
innerhalb eines<data>
Elements, das seinen Namen= Attribut hat, dastransaction_id
gleich ist.
(D)
<event>
enthält<action>
.<action>
mit Name=Attribut gleichdatabase_name
, und Paket=Attribut gleichsqlserver
(nichtpackage0
), dann erhalten Sie den inneren Wert von<value>
Element.
(E)
CROSS APPLY
bewirkt die Wiederholung der Verarbeitung für jedes einzelne<event>
Element, dessenname
Attribut gleichlock_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.