Sdílet prostřednictvím


Cíle pro rozšířené události

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Tento článek vysvětluje, kdy a jak používat cílové objekty pro rozšířené události. Pro každý cíl vysvětluje tento článek:

  • Jeho schopnosti při shromažďování a vytváření sestav dat odesílaných událostmi
  • Jeho parametry, s výjimkou případů, kdy je parametr srozumitelný

Následující tabulka popisuje dostupnost jednotlivých cílových typů v různých databázových strojích.

Typ cíle SQL Server Azure SQL Database Řízená instance Azure SQL
etw_classic_sync_target Ano Ne Ne
počítač událostí Ano Ano Ano
soubor událostí Ano Ano Ano
event_stream Ano Ano Ano
histogram Ano Ano Ano
párové_srovnání Ano Ne Ne
kruhový buffer Ano Ano Ano

Požadavky

Pokud chcete tento článek používat nejvíce, měli byste:

Parametry, akce a pole

Příkaz CREATE EVENT SESSION je centrální pro rozšířené události. K napsání příkazu potřebujete následující:

  • Události, které chcete přidat do relace
  • Pole přidružená k jednotlivým vybraným událostem
  • Parametry přidružené ke každému cíli, který chcete přidat do relací

Příkazy SELECT, které vracejí tyto seznamy ze systémových zobrazení, jsou k dispozici ke kopírování z následujícího článku v jeho části C:

Parametry, pole a akce použité v kontextu skutečného CREATE EVENT SESSION příkazu můžete zobrazit z pohledu B2 (T-SQL).

cíl etw_classic_sync_target

Rozšířené události na SQL Serveru můžou spolupracovat s trasováním událostí pro Windows (ETW) za účelem monitorování systémové aktivity. Další informace najdete tady:

ETW cíl zpracovává data, která přijímá synchronně, zatímco většina cílů zpracovává asynchronně.

Poznámka:

Spravovaná instance Azure SQL a Azure SQL Database nepodporují cíl etw_classic_sync_target. Alternativně použijte event_file cíl s objekty blob uloženými ve službě Azure Storage.

cíl event_counter

Cíl event_counter počítá, kolikrát dojde k každé zadané události.

Na rozdíl od většiny ostatních cílů:

  • Cíl event_counter nemá žádné parametry.
  • Cíl event_counter zpracovává data, která přijímá synchronně.

Příklad výstupu zachyceného cílem event_counter

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

Dále je příkaz CREATE EVENT SESSION , který vrátil předchozí výsledky. V tomto příkladu bylo použito pole package0.counter v predikátu klauzule WHERE k zastavení počítání, jakmile počet dosáhne hodnoty 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
    );

cílový soubor událostí

Cíl event_file zapíše výstup ze záznamu událostí z vyrovnávací paměti na disk nebo do blobu ve službě Azure Storage.

  • V klauzuli filename zadáte ADD TARGET parametr. Přípona souboru musí být xel.
  • Název souboru, který zvolíte, používá systém jako předponu, ke které se připojí dlouhé celé číslo založené na datu a času následované příponou xel .
  • Volitelně můžete zadat MAX_FILE_SIZE parametr. Definuje maximální velikost v megabajtech (MB), na kterou může soubor růst.
  • Kromě aktuálního souboru máte také možnost určit MAX_ROLLOVER_FILES maximální počet souborů, které se mají zachovat v systému souborů. Výchozí hodnota je UNLIMITED. Když MAX_ROLLOVER_FILES se vyhodnotí, pokud počet souborů překročí MAX_ROLLOVER_FILES nastavení, nejstarší soubor se odstraní. Další informace najdete v tématu MAX_ROLLOVER_FILES.

Poznámka:

Spravovaná instance Azure SQL a Azure SQL Database využívají jako hodnotu parametru pouze objekty blob v Azure Storage.

Příklad event_file kódu pro SQL Database nebo SQL Managed Instance najdete v tématu Event File target code pro rozšířené události v SQL Database.

VYTVOŘENÍ RELACE UDÁLOSTÍ s cílem event_file

Tady je příklad CREATE EVENT SESSION klauzule s ADD TARGET klauzulí, která přidává event_file cí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
    );

sys.fn_xe_file_target_read_file()

Cíl event_file ukládá data, která přijímá, v binárním formátu, který není čitelný člověkem. Funkce sys.fn_xe_file_target_read_file umožňuje znázorňovat obsah xel souboru jako relační sadu řádků.

Pro SQL Server 2016 a novější verze použijte SELECT příkaz podobný následujícímu příkladu.

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;

Pro SQL Server 2014 použijte SELECT příkaz podobný následujícímu příkladu. Po SQL Serveru 2014 xem se už soubory nepoužívají.

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;

V obou těchto příkladech se zástupný znak * používá ke čtení všech souborů xel, které začínají zadanou předponou.

Ve službě Azure SQL Database můžete volat funkci sys.fn_xe_file_target_read_file() poté, co vytvoříte přihlašovací údaje na úrovni databáze obsahující token SAS s oprávněními Read a List pro kontejner s objekty blob xel.

/*
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;

Ve službě Azure SQL Managed Instance můžete funkci sys.fn_xe_file_target_read_file() volat po vytvoření přihlašovacích údajů serveru, které obsahují token SAS s oprávněními Read a List na kontejneru s objekty blob xel.

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;

Návod

Pokud v prvním argumentu zadáte předponu názvu objektu blob místo úplného názvu objektu sys.fn_xe_file_target_read_file()blob, funkce vrátí data ze všech objektů blob v kontejneru, které odpovídají předponě. Díky tomu můžete načítat data ze všech průběžných souborů dané relace událostí, aniž by bylo nutné použít zástupný znak *, který Azure Storage nepodporuje.

Předchozí příklady Azure SQL neobsahují rozšíření xel pro čtení všech rollover souborů pro relaci s názvem event-session-1.

Data uložená v cílovém souboru "event_file"

Toto je příklad dat vrácených z sys.fn_xe_file_target_read_file SQL Serveru 2016 (13.x) a novějších verzí.

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

cíl histogramu

Cíl histogram může:

  • Počet výskytů pro několik položek samostatně
  • Počet výskytů různých typů položek:
    • Pole událostí
    • Akce

Cíl histogram zpracovává data, která přijímá synchronně.

Parametr source_type je klíčem k řízení cíle histogramu:

  • source_type=0: Shromažďujte data pro pole událostí.
  • source_type=1: shromážděte data pro akci. Toto je výchozí hodnota.

Výchozí slots parametr je 256. Pokud přiřadíte jinou hodnotu, hodnota se zaokrouhlí nahoru na další mocninu 2. Například sloty =59 by se zaokrouhlovaly nahoru na 64. Maximální počet slotů histogramu pro histogram cíl je 16384.

Při použití histogram jako cíle se někdy můžou zobrazit neočekávané výsledky. Některé události se nemusí zobrazovat v očekávaných slotech, zatímco jiné sloty můžou zobrazovat vyšší než očekávaný počet událostí.

K tomu může dojít v případě, že při přiřazování událostí do slotů dojde ke kolizi hash. Přestože se to stává zřídka, pokud dojde ke kolizi hash, událost, která by měla být započítána do jednoho slotu, se započítá do jiného. Z tohoto důvodu je důležité být opatrný a nevyvozovat, že k události nedošlo jen proto, že počet v určité položce ukazuje nulu.

Jako příklad zvažte následující scénář:

  • Nastavíte relaci rozšířených událostí pomocí histogram jako cíle a seskupování podle object_id ke shromažďování dat o provádění uložených procedur.
  • Spustíte uloženou proceduru A. Pak spustíte uloženou proceduru B.

Pokud funkce hash vrátí stejnou hodnotu pro object_id obě uložené procedury, histogram ukazuje, že se uložená procedura A spouští dvakrát a uložená procedura B se nezobrazí.

Pokud chcete tento problém zmírnit, pokud je počet jedinečných hodnot relativně malý, nastavte počet slotů histogramu vyšší než čtverec očekávaných jedinečných hodnot. Pokud je například cíl histogram nastaven na pole události source, a v databázi je 20 tabulek, pak 20*20 = 400. Další mocnina 2 větší než 400 je 512, což je doporučený počet slotů v tomto příkladu.

Cíl histogramu s akcí

V jeho ADD TARGET ... (SET ...) klauzuli následující CREATE EVENT SESSION příkaz určuje přiřazení source_type=1cílového parametru . To znamená, že účelem histogramu je sledovat akci.

V tomto příkladu ADD EVENT ... (ACTION ...) klauzule nabízí pouze jednu akci k výběru, konkrétně sqlos.system_thread_id. ADD TARGET ... (SET ...) V klauzuli vidíme přiřazení source=N'sqlos.system_thread_id'.

Poznámka:

Pro každou relaci událostí není možné přidat více než jeden cíl stejného typu. To zahrnuje histogram cíl. Není také možné mít více než jeden zdroj (pole akce nebo události) pro jeden histogram cíl. Proto se vyžaduje nová událostní relace ke sledování všech dalších akcí nebo polí událostí v odděleném histogram cíli.

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
        );

Byla zaznamenána následující data. Hodnoty ve sloupci value jsou hodnoty system_thread_id. Například bylo ve vlákně 6540 použito celkem 236 zámků.

value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28

SELECT pro zjištění dostupných akcí

Příkaz C.3SELECT může najít akce, které má systém k dispozici pro zadání v CREATE EVENT SESSION příkazu. WHERE V klauzuli byste nejprve upravili o.name LIKE filtr tak, aby odpovídal akcím, které vás zajímají.

Následuje ukázková sada výsledků vrácená C.3 SELECT. Akce system_thread_id se nachází na druhém řádku.

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

Cíl histogramu s polem události

Následující příklad nastaví source_type=0. Hodnota přiřazená source je pole události.

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
    );

Následující data byla zachycena cílem histogram. Data ukazují, že u databáze s ID 5 došlo k 7 checkpoint_begin událostem.

value   count
-----   -----
5       7
7       4
6       3

SELECT pro zjištění dostupných polí ve zvolené události

Příkaz C.4SELECT zobrazuje pole událostí, ze které si můžete vybrat. Nejdřív byste filtr upravili o.name LIKE tak, aby odpovídal vašemu zvolenému názvu události.

Následující sada řádků vrátila C.4 SELECT. Sada řádků ukazuje, že database_id je jediným polem checkpoint_begin události, která může poskytnout hodnoty cíli histogram.

Package-Name   Event-Name         Field-Name   Field-Description
------------   ----------         ----------   -----------------
sqlserver      checkpoint_begin   database_id  NULL
sqlserver      checkpoint_end     database_id  NULL

cíl párování

Cíl pair_matching umožňuje detekovat počáteční události, ke kterým dochází bez odpovídající koncové události. Může to být například problém, když dojde k události lock_acquired, ale žádná odpovídající událost lock_released nenásleduje včas.

Systém se automaticky neshoduje s počátečními a koncovými událostmi. Místo toho vysvětlíte shodu se systémem v CREATE EVENT SESSION příkazu. Když se spáruje počáteční a koncová událost, pár se zahodí, aby se zaměřily na nesrovnané počáteční události.

Vyhledání odpovídajících polí pro dvojici počáteční a koncové události

Pomocí příkazu C.4 SELECT vidíme v následující sadě řádků přibližně 16 polí události lock_acquired . Sada řádků zobrazená zde byla ručně rozdělena, aby se zobrazila pole, na kterých se náš příklad shodoval. U některých polí, jako je duration, je pokus o shodu nesmyslný.

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

Příklad cíle párového párování

Následující CREATE EVENT SESSION příkaz určuje dvě události a dva cíle. Cíl pair_matching určuje dvě sady polí, které odpovídají událostem ve dvojicích. Posloupnost polí oddělených čárkami, která jsou přiřazena begin_matching_columns a end_matching_columns, musí být stejná. Mezi poli uvedenými v hodnotě oddělené čárkami nejsou povoleny žádné tabulátory ani nové řádky, i když jsou povoleny mezery.

Abychom výsledky zúžili, nejprve jsme vybrali z sys.objects, abychom nalezli object_id v testovací tabulce. V klauzuli jsme přidali filtr pro to jedno ID objektu ADD EVENT ... (WHERE ...).

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
    );

Abychom mohli otestovat relaci události, záměrně jsme zabránili uvolnění dvou získaných zámků. Provedli jsme to pomocí následujících kroků T-SQL:

  1. BEGIN TRANSACTION.
  2. UPDATE MyTable....
  3. Záměrně nevydat COMMIT TRANSACTION až po prozkoumání cílů.
  4. Později po testování jsme vydali COMMIT TRANSACTION.

Jednoduchý event_counter cíl poskytl následující výstupní řádky. Vzhledem k tomu, že 52–50=2, výstup znamená, že při zkoumání výstupu z cíle párování vidíme 2 nevyvážené události lock_acquired.

package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   52
sqlserver      lock_released   50

Cíl pair_matching poskytl následující výstup. Jak navrhuje event_counter výstup, vidíme skutečně dva lock_acquired řádky. Skutečnost, že vidíme tyto řádky, znamená, že tyto dvě lock_acquired události jsou nespárované.

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

Řádky nespárovaných lock_acquired událostí mohou obsahovat text T-SQL, který poskytuje akce sqlserver.sql_text. Tím se zaznamená dotaz, který získal zámky.

Cíl kruhového bufferu

Cíl ring_buffer je užitečný pouze pro rychlou a jednoduchou kolekci událostí v paměti. Když relaci události zastavíte, uložený výstup se zahodí.

V této části si také ukážeme, jak můžete pomocí XQuery převést XML zobrazení obsahu vyrovnávací paměti okruhu do relační sady řádků, která je čitelnější.

Návod

Při přidávání ring_buffer cíle nastavte jeho MAX_MEMORY parametr na 1024 kB nebo méně. Použití větších hodnot může zbytečně zvýšit spotřebu paměti.

Ve výchozím nastavení není cíl MAX_MEMORY v SQL Serveru omezen a v Azure SQL Database a spravované instanci Azure SQL je omezen na 32 MB.

Data z ring_buffer cíle využíváte tak, že je převedete na XML, jak je znázorněno v následujícím příkladu. Během tohoto převodu se vynechá všechna data, která se nevejdou do dokumentu XML o velikosti 4 MB. Proto i když v vyrovnávací paměti okruhu zachytíte více událostí pomocí větších MAX_MEMORY hodnot (nebo když tento parametr ponecháte na výchozí hodnotě), možná nebudete moct všechny tyto události využívat kvůli limitu 4 MB velikosti dokumentu XML vzhledem k režii značek XML a řetězců Unicode.

Víte, že obsah kruhové vyrovnávací paměti je vynechán během převodu na XML, pokud je atribut truncated v dokumentu XML nastaven na hodnotu 1, například:

<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">

VYTVOŘENÍ RELACE UDÁLOSTÍ s cílem ring_buffer

Tady je příklad vytvoření relace události s ring_buffer cílem. V tomto příkladu se parametr MAX_MEMORY zobrazí dvakrát: jednou pro nastavení cílové paměti ring_buffer na 1024 kB a podruhé pro nastavení vyrovnávací paměti pro relaci události na 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
    );

Výstup XML přijatý pro lock_acquired cílem ring_buffer

Při načtení příkazem SELECT se obsah cirkulární vyrovnávací paměti zobrazí jako XML dokument. Následuje příklad. Pro stručnost však byly odebrány všechny prvky kromě dvou <event>. Dále v rámci každého <event> bylo odebráno několik prvků <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>

Pokud chcete zobrazit předchozí kód XML, můžete během aktivní relace událostí spustit následující SELECT. Data XML jsou načtena ze systémového zobrazení 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 pro zobrazení XML jako sady řádků

Pokud chcete zobrazit předchozí xml jako relační sadu řádků, pokračujte z předchozího SELECT příkazu vydáním následujícího jazyka T-SQL. Okomentované řádky vysvětlují každé použití 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);

Poznámky XQuery z předchozího příkazu SELECT

(A)

  • timestamp= hodnota atributu, v <event> elementu.
  • Konstruktor '(...)[1]' zajišťuje pouze jednu hodnotu vrácenou pro iteraci, stejně jako povinné omezení .value() metody XQuery proměnné a sloupců datového typu XML.

(B)

  • <text> vnitřní hodnota prvku, uvnitř <data> prvku, který má atribut name= roven mode.

(C)

  • <value> vnitřní hodnota elementu uvnitř elementu <data>, který má atribut název rovný transaction_id.

(D)

  • <event> obsahuje <action>.
  • <action> mající atribut name= roven database_name, a atribut package= roven sqlserver (ne package0), získat vnitřní hodnotu prvku <value>.

(E)

  • CROSS APPLY způsobí, že zpracování se bude opakovat pro každý jednotlivý <event> prvek, který má atribut name rovný lock_acquired.
  • To platí pro XML vrácený předchozí klauzulí FROM .

Výstup z XQuery SELECT

Dále je sada řádků vygenerovaná předchozím T-SQL, který obsahuje XQuery.

OccurredDtTm              Mode    DatabaseName
------------              ----    ------------
2016-08-05 23:59:53.987   SCH_S   InMemTest2
2016-08-05 23:59:56.013   SCH_S   InMemTest2

cíl event_stream

Cíl event_stream lze použít pouze v programech .NET napsaných v jazycích, jako je C#. Vývojáři .NET včetně C# mají přístup k toku událostí prostřednictvím tříd rozhraní .NET Framework v Microsoft.SqlServer.XEvents.Linq oboru názvů. Tento cíl nejde použít v T-SQL.

Pokud při čtení z 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. cíle narazíte na chybu 25726 event_stream, znamená to, že datový proud událostí se zaplnil daty rychleji, než je mohl klient spotřebovat. To způsobí, že se databázový stroj odpojí od datového proudu událostí, aby nedošlo k ovlivnění výkonu databázového stroje.

Obory názvů XEvent