動機
SQL Server で拡張イベントのセッションを設定中に「SQLトレースでいうあのイベントがないな…」という場面が稀によくあります。
具体的には SP:Completed
に該当するイベントが見つからなくて困っていました。
調査方法
そんなときは下記記事を参考にイベントの対応を確認するクエリを実行しましょう。
SQL トレースのイベント クラスと等価な拡張イベントを確認する
クエリ
USE MASTER;
GO
SELECT DISTINCT
tb.trace_event_id,
te.name AS 'Event Class',
em.package_name AS 'Package',
em.xe_event_name AS 'XEvent Name',
tb.trace_column_id,
tc.name AS 'SQL Trace Column',
am.xe_action_name AS 'Extended Events action'
FROM
sys.trace_events te
LEFT JOIN sys.trace_xe_event_map em ON te.trace_event_id = em.trace_event_id
LEFT JOIN sys.trace_event_bindings tb ON em.trace_event_id = tb.trace_event_id
LEFT JOIN sys.trace_columns tc ON tb.trace_column_id = tc.trace_column_id
LEFT JOIN sys.trace_xe_action_map am ON tc.trace_column_id = am.trace_column_id
ORDER BY te.name, tc.name
結果(一部抜粋)
trace_event_id | Event Class | Package | XEvent Name | trace_column_id | SQL Trace Column | Extended Events action |
---|---|---|---|---|---|---|
43 | SP:Completed | sqlserver | module_end | 1 | TextData | NULL |
43 | SP:Completed | sqlserver | module_end | 2 | BinaryData | NULL |
43 | SP:Completed | sqlserver | module_end | 3 | DatabaseID | database_id |
43 | SP:Completed | sqlserver | module_end | 4 | TransactionID | transaction_id |
43 | SP:Completed | sqlserver | module_end | 5 | LineNumber | tsql_frame |
43 | SP:Completed | sqlserver | module_end | 6 | NTUserName | nt_username |
43 | SP:Completed | sqlserver | module_end | 7 | NTDomainName | nt_username |
43 | SP:Completed | sqlserver | module_end | 8 | HostName | client_hostname |
43 | SP:Completed | sqlserver | module_end | 9 | ClientProcessID | client_pid |
43 | SP:Completed | sqlserver | module_end | 10 | ApplicationName | client_app_name |
43 | SP:Completed | sqlserver | module_end | 11 | LoginName | server_principal_name |
43 | SP:Completed | sqlserver | module_end | 12 | SPID | session_id |
SQLトレースでいう SP:Completed
を拡張イベントで取得するには、module_end
で取得すればいいことが分かりました。
余談
イベントを探す目的では、セッションを作成する際にフィルターをかけても探せます。
RPC:Completed
は rpc_completed
としてあるし、
SP:StmtCompleted
は sp_statement_completed
としてあるし、
SP:Completed
は sp_completed
だよねーと思ったらまさかの module_end
だったのでないものと思い込んでました、反省。