AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 9903
Accepted
Craig Efrein
Craig Efrein
Asked: 2011-12-30 03:14:59 +0800 CST2011-12-30 03:14:59 +0800 CST 2011-12-30 03:14:59 +0800 CST

在 SQL Server 2008 中查询扩展事件

  • 772

我使用从 Kimberly Tripp 的 SQL Server 2008 Internals 书中获得的脚本创建了以下事件会话。它已被修改为发送到文件而不是环形缓冲区。

CREATE EVENT SESSION
[statement_completed_file]
ON SERVER
ADD EVENT
    sqlserver.sp_statement_completed,
ADD EVENT
    sqlserver.sql_statement_completed
    (
        ACTION 
        (
            sqlserver.sql_text
        )
        WHERE
        (
            sqlserver.session_id=53
        )
    )
ADD TARGET package0.asynchronous_file_target
    (
        set filename=N'C:\MSSQL\TEMP\stats.xel', 
        metadatafile=N'C:\MSSQL\TEMP\stats.xem'
    )
WITH
(
    MAX_MEMORY=4096KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=1 SECONDS,
    TRACK_CAUSALITY=OFF,
    STARTUP_STATE=OFF
)

这是查询数据的原始脚本。

SELECT
theNodes.event_data.value('(data/value)[1]', 'bigint') AS source_database_id,
theNodes.event_data.value('(data/value)[2]', 'bigint') AS object_id,
theNodes.event_data.value('(data/value)[3]', 'bigint') AS object_type,
theNodes.event_data.value('(data/value)[4]', 'bigint') AS cpu,
theNodes.event_data.value('(data/value)[5]', 'bigint') AS duration,
theNodes.event_data.value('(data/value)[6]', 'bigint') AS reads,
theNodes.event_data.value('(data/value)[7]', 'bigint') AS writes,
theNodes.event_data.value('(action/value)[1]', 'nvarchar(max)') AS sql_text
FROM
(
    SELECT 
        CONVERT(XML, st.target_data) AS ring_buffer
        FROM sys.dm_xe_sessions s
        JOIN sys.dm_xe_session_targets st ON s.address = st.event_session_address
        WHERE s.name = 'statement_completed'
) AS theData
CROSS APPLY
theData.ring_buffer.nodes('//RingBufferTarget/event') theNodes (event_data)
WHERE theNodes.event_data.value('(action/value)[1]', 'nvarchar(max)') is not null

我如何修改它以从两个文件 xel 和 xem 而不是环形缓冲区中读取。我一直在谷歌上搜索,但学习曲线很粗糙。预先感谢您的帮助。

sql-server-2008 extended-events
  • 2 2 个回答
  • 2563 Views

2 个回答

  • Voted
  1. Best Answer
    Oleg Dok
    2011-12-30T03:26:47+08:002011-12-30T03:26:47+08:00

    试试这个例子:

    CREATE EVENT SESSION
    [statement_completed_file]
    ON SERVER
    ADD EVENT
        sqlserver.sp_statement_completed,
    ADD EVENT
        sqlserver.sql_statement_completed
        (
            ACTION 
            (
                sqlserver.sql_text
            )
            WHERE
            (
                sqlserver.session_id <> 53
            )
        )
    ADD TARGET package0.asynchronous_file_target
        (
            set filename=N'C:\stats.xel', 
            metadatafile=N'C:\stats.xem'
        )
    WITH
    (
        MAX_MEMORY=4096KB,
        EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY=1 SECONDS,
        TRACK_CAUSALITY=OFF,
        STARTUP_STATE=OFF
    )
    GO
    ALTER EVENT SESSION [statement_completed_file]
    ON SERVER
    STATE=START
    GO
    SELECT event_data, 
        event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
        event_data.value('(event/data/value)[1]', 'bigint') AS source_database_id,
        event_data.value('(event/data/value)[2]', 'bigint') AS object_id,
        event_data.value('(event/data/value)[3]', 'bigint') AS object_type,
        event_data.value('(event/data/value)[4]', 'bigint') AS cpu,
        event_data.value('(event/data/value)[5]', 'bigint') AS duration,
        event_data.value('(event/data/value)[6]', 'bigint') AS reads,
        event_data.value('(event/data/value)[7]', 'bigint') AS writes,
        event_data.value('(event/action/value)[1]', 'nvarchar(max)') AS sql_text
    FROM 
    (
        SELECT CAST(event_data AS XML) AS event_data
        FROM sys.fn_xe_file_target_read_file('C:\stats*.xel', 'C:\stats*.xem', null, null)
    ) tbl
    GO
    DROP EVENT SESSION [statement_completed_file] ON SERVER
    GO
    
    • 7
  2. Nabil Becker
    2014-06-12T12:29:32+08:002014-06-12T12:29:32+08:00

    这是另一个查询

    declare
        xmlData xml;
    
    select
        @xmlData    =   [xet].[event_data]
    from
        [sys].fn_xe_file_target_read_file('C:\stats*.xel', 'C:\stats*.xem', null, null) as [xet];
    
    with cte_xmlData as (
        select
            [e].value('@name', 'nvarchar(max)') as [EventName],
            [e].value('@timestamp', 'datetime') as [EventTimeStamp],
            [d].value('value[1]', 'nvarchar(max)') as [DdlPhase],
            [d].value('text[1]', 'nvarchar(max)') as [DdlPhaseDesc],
            [c].value('@name', 'nvarchar(max)') as [Name],
            [c].value('value[1]', 'nvarchar(max)') as [Value]
        from
            @xmlData.nodes('/RingBufferTarget/event') as [xml]([e])
            inner join @xmlData.nodes('/RingBufferTarget/event/action') as [xml2]([c])
                on ( [c].value('../@timestamp', 'datetime') =  [e].value('@timestamp', 'datetime') )
            inner join @xmlData.nodes('/RingBufferTarget/event/data') as [xml3]([d])
                on ( [d].value('../@timestamp', 'datetime') =  [e].value('@timestamp', 'datetime') )
                and ( [d].value('@name', 'nvarchar(max)') = 'ddl_phase' )
        union
        select
            [e].value('@name', 'nvarchar(max)') as [EventName],
            [e].value('@timestamp', 'datetime') as [EventTimeStamp],
            [d].value('value[1]', 'nvarchar(max)') as [DdlPhase],
            [d].value('text[1]', 'nvarchar(max)') as [DdlPhaseDesc],
            [c].value('@name', 'nvarchar(max)') as [Name],
            case
                when [c].exist('text[1]') = 0 then [c].value('value[1]', 'nvarchar(max)')
                else [c].value('text[1]', 'nvarchar(max)')
            end as [Value]
        from
            @xmlData.nodes('/RingBufferTarget/event') as [xml]([e])
            inner join @xmlData.nodes('/RingBufferTarget/event/data') as [xml2]([c])
                on ( [c].value('../@timestamp', 'datetime') =  [e].value('@timestamp', 'datetime') )
            inner join @xmlData.nodes('/RingBufferTarget/event/data') as [xml3]([d])
                on ( [d].value('../@timestamp', 'datetime') =  [e].value('@timestamp', 'datetime') )
                and ( [d].value('@name', 'nvarchar(max)') = 'ddl_phase' )
    )
    /**/
    select
        [pData].[EventName],
        [pData].[EventTimeStamp],
        [pData].[DdlPhaseDesc],
        [pData].[event_name],
        [pData].[source_database_id],
        [pData].[object_id],
        [pData].[object_type],
        [pData].[cpu],
        [pData].[duration],
        [pData].[reads],
        [pData].[writes],
        [pData].[sql_text]
    from
        [cte_xmlData]
        -- Modify the in statement depending on what you want
        pivot(max([value]) for [name] in ([event_name], [source_database_id], [object_id], [object_type], [cpu], [duration], [reads], [writes], [sql_text])) as [pData]
    order by
        [EventTimeStamp],
        [DdlPhase];
    
    • 2

相关问题

  • 连接不同地理区域的数据库的最佳实践

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve