【问题标题】:How to read extended events .xel file如何读取扩展事件 .xel 文件
【发布时间】:2018-11-05 03:37:55
【问题描述】:

我有一个特定的请求来读取/解析扩展事件文件的 .xel 文件,我怎样才能有效和高效地做到这一点。我的一位同事建议使用 API 来解析文件,但是我相信应该有一种方法可以通过 SQL 代码本身来实现。非常感谢帮助。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    要读取 .xel 文件,您可以使用sys.fn_xe_file_target_read_file 函数。例如:

    select cast(event_data as XML) as event_data
    from sys.fn_xe_file_target_read_file('D:\Folder\MySession*.xel', null, null, null)
    

    您可能还需要解析返回的 XML 以获取表格格式的数据。为此,您需要决定从 XML 中提取哪些数据并编写适当的 XPath 表达式。例如:

    -- You have to know element names and their data types
    select
        n.value('(@name)[1]', 'varchar(50)') as event_name,
        n.value('(@package)[1]', 'varchar(50)') AS package_name,
        n.value('(@timestamp)[1]', 'datetime2') AS [utc_timestamp],
        n.value('(data[@name="duration"]/value)[1]', 'int') as duration,
        n.value('(data[@name="cpu_time"]/value)[1]', 'int') as cpu,
        n.value('(data[@name="physical_reads"]/value)[1]', 'int') as physical_reads,
        n.value('(data[@name="logical_reads"]/value)[1]', 'int') as logical_reads,
        n.value('(data[@name="writes"]/value)[1]', 'int') as writes,
        n.value('(data[@name="row_count"]/value)[1]', 'int') as row_count,
        n.value('(data[@name="last_row_count"]/value)[1]', 'int') as last_row_count,
        n.value('(data[@name="line_number"]/value)[1]', 'int') as line_number,
        n.value('(data[@name="offset"]/value)[1]', 'int') as offset,
        n.value('(data[@name="offset_end"]/value)[1]', 'int') as offset_end,
        n.value('(data[@name="statement"]/value)[1]', 'nvarchar(max)') as statement,
        n.value('(action[@name="database_name"]/value)[1]', 'nvarchar(128)') as database_name
    from (select cast(event_data as XML) as event_data
    from sys.fn_xe_file_target_read_file('D:\Folder\MySession*.xel', null, null, null)) ed
    cross apply ed.event_data.nodes('event') as q(n)
    

    【讨论】:

    • 这就足够了。这些是我们唯一用于扩展事件的字段吗?如果我需要包含查询计划,我该怎么做?
    • 不,这些字段只是一个示例。您应该读取从会话中捕获的数据。首先查看从文件中读取的 xml,然后构造适当的 XPath 查询以将其转换为表(如果需要)。您可以使用 XE 捕获数以千计的内容,但这与“如何读取 .xel 文件”问题无关。显然,您只能读取文件中写入的内容。
    • 我对此进行了一些调查,现在我能够修改 XPath 查询以获得给定特定场景/要求所需的内容。您的 cmets 和答案对深入了解有很大帮助。这真的很有帮助
    • 很高兴我能帮上忙!如果您接受并支持我的回答,我们将不胜感激。
    【解决方案2】:

    我有一个来自 Azure SQL 数据库的审核系统的 XEL 文件,所以我找到了这篇文章。但它不会与 fn_xe_file_target_read_file 一起运行,所以我不得不像这样使用 fn_get_audit_file

    select * from sys.fn_get_audit_file('c:\temp\08_11_22_921_16*.xel', null, null)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多