Dela via


Mål för utökade händelser

gäller för:SQL ServerAzure SQL DatabaseAzure 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:

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 i ADD TARGET -satsen. Filnamnstillägget måste vara xel.
  • 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är MAX_ROLLOVER_FILES utvärderas tas den äldsta filen bort om antalet filer överskrider MAX_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 efter object_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:

  1. BEGIN TRANSACTION.
  2. UPDATE MyTable....
  3. Utfärda avsiktligt inte en COMMIT TRANSACTION, förrän vi har granskat målen.
  4. 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 med mode.

(C)

  • <value> elementens inre värde, inom ett <data> element, som har dess namn= attribut lika med transaction_id.

(D)

  • <event> innehåller <action>.
  • <action> med name= attributet som är lika med database_name, och package= attributet som är lika med sqlserver (inte package0), 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 ett name attribut som är lock_acquiredlika 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.

XEvent-namnområden