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
Spravovaná instance
Azure SQLDatabáze SQL v Microsoft Fabric
Pokud máte existující skript trasování SQL, který chcete převést na relaci rozšířených událostí, můžete pomocí postupů v tomto tématu vytvořit ekvivalentní relaci rozšířených událostí. Pomocí informací v systémových tabulkách trace_xe_action_map a trace_xe_event_map můžete shromáždit informace, které musíte k převodu provést.
Mezi tyto kroky patří:
Spuštěním existujícího skriptu vytvořte relaci trasování SQL a poté získejte ID trasování.
Spusťte dotaz, který používá funkci fn_trace_geteventinfo k vyhledání ekvivalentních událostí rozšířených událostí a akcí pro každou třídu událostí trasování SQL a příslušné sloupce.
Pomocí funkce fn_trace_getfilterinfo vypíšete filtry a ekvivalentní akce rozšířených událostí, které se mají použít.
Ručně vytvořte relaci rozšířených událostí s použitím ekvivalentních událostí, akcí a predikátů (filtrů).
Chcete-li získat ID trasování
Otevřete skript trasování SQL v Editoru dotazů a potom spusťte skript pro vytvoření relace trasování. Mějte na paměti, že k dokončení tohoto postupu není nutné mít spuštěnou sledovací relaci.
Získejte ID sledování. K tomu použijte následující dotaz:
SELECT * FROM sys.traces; GOPoznámka:
ID trasování 1 obvykle označuje výchozí trasování.
Určení ekvivalentů rozšířených událostí
Chcete-li určit ekvivalentní události a akce rozšířených událostí, spusťte následující dotaz, kde trace_id je nastavena na hodnotu ID trasování, které jste získali v předchozím postupu.
Poznámka:
V tomto příkladu se používá ID trasování pro výchozí trasování (1).
USE MASTER; GO DECLARE @trace_id int; SET @trace_id = 1; SELECT DISTINCT el.eventid, em.package_name, em.xe_event_name AS 'event' , el.columnid, ec.xe_action_name AS 'action' FROM (sys.fn_trace_geteventinfo(@trace_id) AS el LEFT OUTER JOIN sys.trace_xe_event_map AS em ON el.eventid = em.trace_event_id) LEFT OUTER JOIN sys.trace_xe_action_map AS ec ON el.columnid = ec.trace_column_id WHERE em.xe_event_name IS NOT NULL AND ec.xe_action_name IS NOT NULL;Vrátí se ekvivalentní ID události Extended Events, název balíčku, název události, ID sloupce a název akce. Tento výstup použijete v postupu "Vytvoření relace rozšířených událostí" dále v tomto tématu.
V některých případech se filtrovaný sloupec mapuje na datové pole události, které je ve výchozím nastavení součástí události Extended Events. Proto sloupec "Extended_Events_action_name" bude null. Pokud k tomu dojde, musíte provést následující kroky, abyste zjistili, které datové pole odpovídá filtrovanému sloupci:
U akcí, které vracejí hodnotu NULL, určete, které třídy událostí trasování SQL ve skriptu obsahují sloupec, který se filtruje.
Mohli jste například použít třídu událostí SP:StmtCompleted a zadali jste filtr pro název sloupce trasování Doba trvání (třída událostí trasování SQL ID 45 a sloupec trasování SQL ID 13). V tomto případě se název akce ve výsledcích dotazu zobrazí jako NULL.
Pro každou třídu událostí trasování SQL, kterou jste identifikovali v předchozím kroku, vyhledejte ekvivalentní název události Extended Events. (Pokud si nejste jistí ekvivalentním názvem události, použijte dotaz v tématu Zobrazení ekvivalentů rozšířených událostí ke třídám událostí trasování SQL.)
Pomocí následujícího dotazu identifikujte správná datová pole, která se mají použít pro události, které jste identifikovali v předchozím kroku. Dotaz zobrazuje datová pole Rozšířených událostí ve sloupci "event_field". V dotazu nahraďte <event_name> názvem události, kterou jste zadali v předchozím kroku.
SELECT xp.name package_name, xe.name event_name ,xc.name event_field, xc.description FROM sys.trace_xe_event_map AS em INNER JOIN sys.dm_xe_objects AS xe ON em.xe_event_name = xe.name INNER JOIN sys.dm_xe_packages AS xp ON xe.package_guid = xp.guid AND em.package_name = xp.name INNER JOIN sys.dm_xe_object_columns AS xc ON xe.name = xc.object_name WHERE xe.object_type = 'event' AND xc.column_type <> 'readonly' AND em.xe_event_name = '<event_name>';Například událost třídy SP:StmtCompleted odpovídá události Extended Events sp_statement_completed. Pokud v dotazu zadáte sp_statement_completed jako název události, zobrazí se ve sloupci "event_field" pole, která jsou ve výchozím nastavení součástí události. Když se podíváte na pole, uvidíte, že existuje pole 'doba trvání'. Chcete-li vytvořit filtr v ekvivalentní relaci rozšířených událostí, přidejte predikát, například "WHERE duration > 0". Příklad najdete v postupu "Vytvoření relace rozšířených událostí" v této části.
Vytvořit relaci rozšířených událostí
Pomocí Editoru dotazů vytvořte relaci událostí a zapište výstup do cílového souboru. Následující kroky popisují jeden dotaz s vysvětlením, které vám ukážou, jak vytvořit dotaz. Úplný příklad dotazu najdete v části Příklad tohoto tématu.
Přidejte příkazy pro vytvoření relace události a nahraďte session_name názvem, který chcete použít pro relaci rozšířených událostí.
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name') DROP EVENT SESSION [Session_Name] ON SERVER; CREATE EVENT SESSION [Session_Name] ON SERVER;Přidejte události a akce rozšířené události, které byly vráceny jako výstup v postupu "Určení ekvivalentů rozšířených událostí", a přidejte predikáty (filtry), které jste identifikovali v postupu "Určení filtrů použitých ve skriptu".
Následující příklad používá skript trasování SQL, který obsahuje třídy událostí SQL:StmtStarting a SP:StmtCompleted s filtry pro ID relace a dobu trvání. Ukázkový výstup dotazu v postupu Určení ekvivalentů rozšířených událostí vrátil následující sadu výsledků:
Eventid package_name event columnid action 44 sqlserver sp_statement_starting 6 nt_username 44 sqlserver sp_statement_starting 9 client_pid 44 sqlserver sp_statement_starting 10 client_app_name 44 sqlserver sp_statement_starting 11 server_principal_name 44 sqlserver sp_statement_starting 12 session_id 45 sqlserver sp_statement_completed 6 nt_username 45 sqlserver sp_statement_completed 9 client_pid 45 sqlserver sp_statement_completed 10 client_app_name 45 sqlserver sp_statement_completed 11 server_principal_name 45 sqlserver sp_statement_completed 12 session_idPokud chcete tuto akci převést na ekvivalent rozšířených událostí, přidají se sqlserver.sp_statement_starting a události sqlserver.sp_statement_completed se seznamem akcí. Predikátové příkazy jsou zahrnuty jako klauzule WHERE.
ADD EVENT sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 ), ADD EVENT sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 AND duration > 0 )Přidejte cíl asynchronního souboru a nahraďte cesty k souborům umístěním, kam chcete výstup uložit. Při specifikaci cíle souboru musíte uvést soubor protokolu a cestu k souboru metadat.
ADD TARGET package0.asynchronous_file_target( SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Zobrazení výsledků
K zobrazení výstupu můžete použít funkci sys.fn_xe_file_target_read_file. Uděláte to tak, že spustíte následující dotaz a nahradíte cesty k souborům zadanými cestami:
SELECT *, CAST(event_data as XML) AS 'event_data_XML' FROM sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel', 'c:\temp\ExtendedEventsStoredProcs*.xem', NULL, NULL);Poznámka:
Převod dat události na XML je volitelný.
Další informace o funkci sys.fn_xe_file_target_read_file naleznete v tématu sys.fn_xe_file_target_read_file (Transact-SQL).
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name') DROP EVENT SESSION [session_name] ON SERVER; CREATE EVENT SESSION [session_name] ON SERVER ADD EVENT sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 ), ADD EVENT sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 AND duration > 0 ); ADD TARGET package0.asynchronous_file_target (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Example
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')
DROP EVENT SESSION [session_name] ON SERVER;
CREATE EVENT SESSION [session_name]
ON SERVER
ADD EVENT sqlserver.sp_statement_starting
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59
),
ADD EVENT sqlserver.sp_statement_completed
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59 AND duration > 0
)
ADD TARGET package0.asynchronous_file_target
(SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Viz také
Zobrazení ekvivalentů rozšířených událostí ke třídám událostí trasování SQL