Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Den här artikeln förklarar när och hur du använder målen för Extended Events. För varje mål förklaras följande i den här artikeln:
- Dess förmåga att samla in och rapportera data som skickas av händelser
- Dess parametrar, förutom när parametern är självförklarande
I följande tabell beskrivs tillgängligheten för varje måltyp i olika databasmotorer.
Måltyp | SQL Server | Azure SQL Database | Hanterad instans i Azure SQL |
---|---|---|---|
etw_classic_sync_target | Ja | Nej | Nej |
event_counter | Ja | Ja | Ja |
händelse_fil | Ja | Ja | Ja |
event_stream | Ja | Ja | Ja |
histogram | Ja | Ja | Ja |
pair_matching | Ja | Nej | Nej |
ring_buffer | Ja | Ja | Ja |
Förutsättningar
Om du vill använda den här artikeln på bästa sätt bör du:
Bekanta dig med grunderna i Extended Events enligt beskrivningen i Snabbstart: Utökade händelser.
Har installerat en ny version av SQL Server Management Studio (SSMS). Mer information finns i Ladda ned SQL Server Management Studio (SSMS).
I SSMS vet du hur du använder Object Explorer för att högerklicka på målnoden under händelsesessionen för att enkelt visa utdata.
Parametrar, åtgärder och fält
Instruktionen SKAPA HÄNDELSESESSION är central för utökade händelser. För att skriva uttalandet behöver du följande:
- De händelser som du vill lägga till i sessionen
- Fälten som är associerade med varje vald händelse
- Parametrarna som är associerade med varje mål som du vill lägga till i sessionerna
SELECT-instruktioner, som returnerar sådana listor från systemvyer, är tillgängliga att kopiera från följande artikel i dess avsnitt C:
Du kan se parametrar, fält och åtgärder som används i kontexten för en faktisk CREATE EVENT SESSION
instruktion, från avsnitt B2 (T-SQL-perspektiv).
etw_classic_sync_target måltavla
I SQL Server kan utökade händelser samverka med händelsespårning för Windows (ETW) för att övervaka systemaktivitet. Mer information finns i:
Det här ETW-målet bearbetar de data som tas emot synkront, medan de flesta mål bearbetas asynkront.
Anmärkning
Azure SQL Managed Instance och Azure SQL Database stöder etw_classic_sync_target
inte målet. Du kan också använda event_file
målet med blobar som lagras i Azure Storage.
händelseräknare mål
Målet event_counter
räknar hur många gånger varje angiven händelse inträffar.
Till skillnad från de flesta andra mål:
- Målet
event_counter
har inga parametrar. - Målenheten
event_counter
bearbetar de data som den tar emot synkront.
Exempel på utdata som samlas in av event_counter-målet
package_name event_name count
------------ ---------- -----
sqlserver checkpoint_begin 4
Nästa är CREATE EVENT SESSION
instruktionen som returnerade föregående resultat. I det här exemplet användes fältet package0.counter
i WHERE
satspredikatet för att sluta räkna efter att antalet har nått 4.
CREATE EVENT SESSION [event_counter_1]
ON SERVER
ADD EVENT sqlserver.checkpoint_begin -- Test by issuing CHECKPOINT; statements.
(
WHERE [package0].[counter] <= 4 -- A predicate filter.
)
ADD TARGET package0.event_counter
WITH
(
MAX_MEMORY = 4096 KB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
event_file målfil
Målet event_file
skriver utdata från en händelsesession från buffert till en diskfil eller till en blob i Azure Storage:
- Du anger parametern
filename
iADD TARGET
-satsen. Filnamnstillägget måste varaxel
. - Det filnamn som du väljer används av systemet som ett prefix som ett datum-tidsbaserat långt heltal läggs till i, följt av
xel
tillägget. - Du kan också ange parametern
MAX_FILE_SIZE
. Den definierar den maximala storleken i megabyte (MB) som filen kan växa till. - Du kan också välja att använda
MAX_ROLLOVER_FILES
alternativet för att ange det maximala antalet filer som ska behållas i filsystemet utöver den aktuella filen. Standardvärdet är UNLIMITED. NärMAX_ROLLOVER_FILES
utvärderas tas den äldsta filen bort om antalet filer överskriderMAX_ROLLOVER_FILES
inställningen. Mer information finns i MAX_ROLLOVER_FILES.
Anmärkning
Azure SQL Managed Instance och Azure SQL Database hanterar bara blobbar i Azure Storage som värdet för parametern filename
.
Ett event_file
kodexempel för SQL Database eller SQL Managed Instance finns i Målkod för händelsefil för utökade händelser i SQL Database.
SKAPA HÄNDELSESESSION med händelse_filmål
Här är ett exempel på CREATE EVENT SESSION
med en ADD TARGET
-sats som lägger till ett event_file
mål.
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',
max_file_size=(100),
max_rollover_files=(10)
)
WITH
(
MAX_MEMORY=4096 KB,
MAX_DISPATCH_LATENCY=10 SECONDS
);
funktionen sys.fn_xe_file_target_read_file()
Målet event_file
lagrar de data som det tar emot i ett binärt format som inte kan läsas av människor. Med funktionen sys.fn_xe_file_target_read_file kan du representera innehållet i en xel
fil som en relationsraduppsättning.
För SQL Server 2016 och senare versioner använder du en SELECT
instruktion som liknar följande exempel.
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;
För SQL Server 2014 använder du en SELECT
instruktion som liknar följande exempel. Efter SQL Server 2014 xem
används inte längre filerna.
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;
I båda dessa exempel *
används jokertecknet för att läsa alla xel
filer som börjar med det angivna prefixet.
I Azure SQL Database kan du anropa sys.fn_xe_file_target_read_file()
funktionen när du har skapat en databasomfattande autentiseringsuppgift som innehåller en SAS-token med behörigheterna Read
och List
på containern med xel
blobarna:
/*
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;
I Azure SQL Managed Instance kan du anropa sys.fn_xe_file_target_read_file()
funktionen när du har skapat en serverautentiseringsuppgift som innehåller en SAS-token med behörigheterna Read
och List
för containern med xel
blobarna:
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;
Tips/Råd
Om du anger ett blobnamnprefix i stället för det fullständiga blobnamnet i det första argumentet i sys.fn_xe_file_target_read_file()
returnerar funktionen data från alla blobar i containern som matchar prefixet. På så sätt kan du hämta data från alla rollover-filer i en viss händelsesession utan att använda *
jokertecknet, som inte stöds av Azure Storage.
Föregående Azure SQL-exempel utelämnar xel
tillägget för att läsa alla rollover-filer för en session med namnet event-session-1
.
Data som lagras i målet för event_file
Det här är ett exempel på data som returneras från sys.fn_xe_file_target_read_file
i SQL Server 2016 (13.x) och senare versioner.
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
histogrammåltavla
Målet histogram
kan:
- Räkna förekomster för flera objekt separat
- Antal förekomster av olika typer av objekt:
- Händelsefält
- Åtgärder
Målenheten histogram
bearbetar de data som den tar emot synkront.
Parametern source_type
är nyckeln till att styra histogrammålet:
-
source_type=0
: samla in data för ett händelsefält. -
source_type=1
: samla in data för en åtgärd. Det här är standardinställningen.
Standardvärdet för parametern slots
är 256. Om du tilldelar ett annat värde avrundas värdet upp till nästa effekt på 2. Till exempel avrundas slots=59 upp till 64. Det maximala antalet histogramfack för ett histogram
mål är 16384.
När du använder histogram
som mål kan du ibland se oväntade resultat. Vissa händelser kanske inte visas på de förväntade platserna, medan andra platser kan visa ett högre antal händelser än förväntat.
Detta kan inträffa om en hash-kollision inträffar när händelser tilldelas till platser. Även om detta är ovanligt, inträffar en hashkollision och en händelse som borde räknas i en slot räknas i en annan. Därför bör man vara noga med att anta att en händelse inte inträffade bara för att antalet i ett visst fack visas som noll.
Tänk till exempel på följande scenario:
- Du konfigurerar en Extended Events-session med
histogram
som mål och gruppering efterobject_id
för att samla in lagrade procedurers körning. - Du kör den lagrade proceduren A. Sedan kör du lagrad procedur B.
Om hash-funktionen returnerar samma värde för båda lagrade object_id
procedurerna, visar histogrammet lagrad procedur A som körs två gånger och lagrad procedur B visas inte.
För att undvika det här problemet när antalet distinkta värden är relativt litet anger du antalet histogramplatser som är högre än kvadraten med förväntade distinkta värden. Om histogram
-målet exempelvis har sitt source
satt till table_name
-händelsefält och det finns 20 tabeller i databasen, då blir det 20*20 = 400. Nästa tvåpotens större än 400 är 512, vilket är det rekommenderade antalet slottar i det här exemplet.
Histogrammål med en åtgärd
I dess ADD TARGET ... (SET ...)
-sats anger följande CREATE EVENT SESSION
-instruktion målparametertilldelningen source_type=1
. Detta innebär att histogrammålet följer en aktivitet.
I det här exemplet ADD EVENT ... (ACTION ...)
råkar satsen endast erbjuda en åtgärd att välja, nämligen sqlos.system_thread_id
. I klausulen ser vi tilldelningen ADD TARGET ... (SET ...)
.
Anmärkning
Det går inte att lägga till fler än ett mål av samma typ per händelsesession. Detta inkluderar målet histogram
. Det går inte heller att ha fler än en källa (åtgärd/händelsefält) per histogram
mål. Därför krävs en ny händelsesession för att spåra eventuella ytterligare åtgärder eller händelsefält i ett separat histogram
mål.
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
);
Följande data har samlats in. Värdena i value
kolumnen är system_thread_id
värden. Till exempel togs totalt 236 lås under tråd 6540.
value count
----- -----
6540 236
9308 91
9668 74
10144 49
5244 44
2396 28
VÄLJ för att identifiera tillgängliga åtgärder
C.3-instruktionenSELECT
kan hitta de åtgärder som systemet har tillgängligt för dig att ange i -instruktionenCREATE EVENT SESSION
. I WHERE
klausulen redigerar du först o.name LIKE
filtret så att det matchar de åtgärder som intresserar dig.
Nästa är en exempelraderuppsättning som returneras av C.3 SELECT
. Åtgärden system_thread_id
visas på den andra raden.
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ål med ett händelsefält
I följande exempel anges source_type=0
. Värdet som tilldelats source
är ett händelsefält.
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
);
Följande data har samlats in av histogram
målet. Data visar att databasen med ID 5 upplevde 7 checkpoint_begin
händelser.
value count
----- -----
5 7
7 4
6 3
VÄLJ för att identifiera tillgängliga fält för din valda händelse
C.4-instruktionenSELECT
visar händelsefält som du kan välja mellan. Först redigerar du filtret så att det o.name LIKE
blir ditt valda händelsenamn.
Följande raduppsättning returnerades av C.4 SELECT
. Raduppsättningen visar att database_id
är det enda fältet på händelsen checkpoint_begin
som kan ange värden för målet histogram
.
Package-Name Event-Name Field-Name Field-Description
------------ ---------- ---------- -----------------
sqlserver checkpoint_begin database_id NULL
sqlserver checkpoint_end database_id NULL
parmatchning mål
Med pair_matching
målet kan du identifiera starthändelser som inträffar utan motsvarande sluthändelse. Det kan till exempel vara ett problem när en lock_acquired
händelse inträffar, men ingen matchande lock_released
händelse följer i tid.
Systemet matchar inte start- och sluthändelser automatiskt. I stället förklarar du matchningen för systemet i ditt CREATE EVENT SESSION
uttalande. När en start- och sluthändelse matchas kastas paret bort för att fokusera på de omatchade starthändelserna.
Hitta matchningsbara fält för start- och sluthändelseparet
Genom att använda C.4 SELECT ser vi i följande raduppsättning att det finns cirka 16 fält för lock_acquired
händelsen. Raduppsättningen som visas här har delats manuellt för att visa vilka fält som vårt exempel matchade på. För vissa fält, till exempel duration
, är det meningslöst att försöka matcha.
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
Ett exempel på målet för parmatchning
Följande CREATE EVENT SESSION
instruktion anger två händelser och två mål. Målet pair_matching
anger två uppsättningar fält som matchar händelserna i par. Sekvensen med kommaavgränsade fält som tilldelats begin_matching_columns
och end_matching_columns
måste vara densamma. Inga flikar eller nya rader tillåts mellan fälten som anges i det kommaavgränsade värdet, även om blanksteg tillåts.
För att begränsa resultaten valde vi först från sys.objects
för att hitta object_id
i vår testtabell. Vi har lagt till ett filter för det objekt-ID:t i ADD EVENT ... (WHERE ...)
-satsen.
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
);
För att testa händelsesessionen förhindrade vi avsiktligt att två förvärvade lås släpptes. Vi gjorde detta med följande T-SQL-steg:
-
BEGIN TRANSACTION
. -
UPDATE MyTable...
. - Utfärda avsiktligt inte en
COMMIT TRANSACTION
, förrän vi har granskat målen. - Senare efter testningen utfärdade vi en
COMMIT TRANSACTION
.
Det enkla event_counter
målet gav följande utdatarader. Eftersom 52-50=2 innebär datautdata att vi ser 2 oparade lock_acquired-händelser när vi granskar output från parningsmålet.
package_name event_name count
------------ ---------- -----
sqlserver lock_acquired 52
sqlserver lock_released 50
Målet pair_matching
angav följande utdata. Som föreslås av event_counter
utdata, ser vi faktiskt de två lock_acquired
raderna. Det faktum att vi ser dessa rader överhuvudtaget innebär att dessa två lock_acquired
händelser är oparade.
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
Raderna för de oparade lock_acquired
händelserna kan inkludera T-SQL-texten som tillhandahålls av åtgärden sqlserver.sql_text
. Detta identifierar frågan som tog låsen.
ring_buffer mål
Målet ring_buffer
är praktiskt för en snabb och enkel insamling av händelser i minnet. När du stoppar händelsesessionen ignoreras de lagrade utdata.
I det här avsnittet visar vi också hur du kan använda XQuery för att konvertera XML-representationen av innehållet i ringbufferten till en mer läsbar relationsraduppsättning.
Tips/Råd
När du lägger till ett ring_buffer
mål anger du parametern MAX_MEMORY
till 1 024 KB eller mindre. Om du använder större värden kan minnesförbrukningen öka i onödan.
Som standard är MAX_MEMORY
för ett ring_buffer
mål inte begränsat i SQL Server och begränsas till 32 MB i Azure SQL Database och Azure SQL Managed Instance.
Du använder data från ett ring_buffer
mål genom att konvertera dem till XML, som du ser i följande exempel. Under den här konverteringen utelämnas alla data som inte passar in i ett 4 MB XML-dokument. Även om du samlar in fler händelser i ringbufferten med hjälp av större MAX_MEMORY
värden (eller om du lämnar den här parametern som standardvärde) kanske du inte kan använda alla av dem på grund av gränsen på 4 MB för XML-dokumentstorleken, med tanke på omkostnaderna för XML-markering och Unicode-strängar.
Du vet att innehållet i ringbufferten utelämnas under konverteringen till XML om attributet truncated
i XML-dokumentet är inställt på 1
, till exempel.
<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">
SKAPA HÄNDELSESESSION med en ringbuffert som mål
Här är ett exempel på hur du skapar en händelsesession med ett ring_buffer
mål. I det här exemplet visas parametern MAX_MEMORY
två gånger: en gång för att ange ring_buffer
målminnet till 1 024 KB och en gång för att ange händelsesessionens buffertminne till 2 MB.
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
);
XML-utdata som tagits emot för lock_acquired av ring_buffer-målet
När det hämtas av en SELECT
-instruktion visas innehållet i en ringbuffert som ett XML-dokument. Ett exempel visas härnäst. Men för korthet har alla utom två <event>
element tagits bort. Dessutom har ett antal <event>
element tagits bort inom varje <data>
.
<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>
Om du vill se föregående XML kan du utfärda följande SELECT
när händelsesessionen är aktiv. XML-data hämtas från systemvyn sys.dm_xe_session_targets
.
SELECT CAST(LocksAcquired.TargetXml AS XML) AS RBufXml
INTO #XmlAsTable
FROM (
SELECT CAST(t.target_data AS XML) AS TargetXml
FROM sys.dm_xe_session_targets AS t
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 för att se XML som en raduppsättning
Om du vill se föregående XML som en relationsraduppsättning, fortsätt från föregående SELECT
genom att köra följande T-SQL. De kommenterade raderna förklarar varje användning av XQuery.
SELECT
-- (A)
ObjectLocks.value('(@timestamp)[1]', 'datetime') AS [OccurredDtTm],
-- (B)
ObjectLocks.value('(data[@name="mode"]/text)[1]', 'nvarchar(32)') AS [Mode],
-- (C)
ObjectLocks.value('(data[@name="transaction_id"]/value)[1]', 'bigint') AS [TxnId],
-- (D)
ObjectLocks.value('(action[@name="database_name" and @package="sqlserver"]/value)[1]', 'nvarchar(128)') AS [DatabaseName]
FROM #XmlAsTable
CROSS APPLY
-- (E)
TargetDateAsXml.nodes('/RingBufferTarget/event[@name="lock_acquired"]') AS T(ObjectLocks);
XQuery-anteckningar från föregående SELECT
(A)
- timestamp= attributets värde, på
<event>
elementet. - Konstruktionen
'(...)[1]'
säkerställer endast ett värde som returneras per iteration, vilket är en nödvändig begränsning för.value()
XQuery-metoden för XML-datatypvariabeln och kolumnerna.
(B)
-
<text>
elementets inre värde, inom ett<data>
element, som har dess namn= attribut lika medmode
.
(C)
-
<value>
elementens inre värde, inom ett<data>
element, som har dess namn= attribut lika medtransaction_id
.
(D)
-
<event>
innehåller<action>
. -
<action>
med name= attributet som är lika meddatabase_name
, och package= attributet som är lika medsqlserver
(intepackage0
), hämta det inre värdet av<value>
elementet.
(E)
-
CROSS APPLY
gör att bearbetningen upprepas för varje enskilt<event>
element, som har ettname
attribut som ärlock_acquired
lika med . - Detta gäller för den XML som returnerades av den föregående
FROM
del.
Utdata från XQuery SELECT
Nästa är raduppsättningen som genererades av föregående T-SQL, som innehåller XQuery.
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 destinationsadress
Målet event_stream
kan bara användas i .NET-program som skrivits på språk som C#. C# och andra .NET-utvecklare kan komma åt en händelseström via .NET Framework-klasser i Microsoft.SqlServer.XEvents.Linq
namnområdet. Det här målet kan inte användas i T-SQL.
Om du får fel 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.
när du läser från målet event_stream
innebär det att händelseströmmen fylldes med data snabbare än klienten kunde bearbeta data. Detta gör att databasmotorn kopplas från händelseströmmen för att undvika att påverka databasmotorns prestanda.