Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure 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:
Seznamte se se základy rozšířených událostí, jak je popsáno v rychlém startu: Rozšířené události.
Nainstalovali jste nedávnou verzi aplikace SQL Server Management Studio (SSMS). Další informace najdete v tématu Stažení aplikace SQL Server Management Studio (SSMS).
V nástroji SSMS zjistěte, jak pomocí Průzkumníka objektů kliknout pravým tlačítkem myši na cílový uzel v rámci relace událostí, abyste mohli snadno zobrazit výstupní data.
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:
-
SELECTy a JOINy z systémových pohledů pro rozšířené události v SQL Serveru
- C.4 Vyberte pole pro událost.
- C.6 SELECT parametry pro cíl
- C.3 VYBERTE akce.
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:
- Trasování událostí pro cíl v systému Windows
- Monitorování systémové aktivity pomocí rozšířených událostí
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áteADD TARGET
parametr. Přípona souboru musí býtxel
. - 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í podleobject_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=1
cí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:
-
BEGIN TRANSACTION
. -
UPDATE MyTable...
. - Záměrně nevydat
COMMIT TRANSACTION
až po prozkoumání cílů. - 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= rovenmode
.
(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= rovendatabase_name
, a atribut package= rovensqlserver
(nepackage0
), 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á atributname
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.