如何使用C#中的扩展事件复制sp_trace的功能?

时间:2014-12-06 17:54:13

标签: c# sql sql-server trace extended-events

我正在开发一个C#应用程序,它使用各种sp_trace过程来查看来自远程SQL Server数据库的事件。我最感兴趣的特定事件是查询和存储过程的开始和结束。我需要每个事件的数据,如时间,SQL文本,主机名等。

MSFT的文档说,不推荐使用sp_trace功能,而是由扩展事件替换。我还发现了一些文章,指出扩展事件会对数据库产生更少的开销。但是,我很难找到使用扩展事件来复制跟踪功能的教程或示例。

因此,我的问题是,我需要从C#app执行哪些存储过程的顺序才能有效地跟踪数据库?

1 个答案:

答案 0 :(得分:0)

使用DDL创建扩展事件跟踪,而不是使用存储过程。下面的示例显示了包含环形缓冲区和跟踪文件目标的跟踪,以及来自' sys.fn_xe_file_target_read_file'的选择。 TVF返回XE跟踪数据。

如果您不需要持久性并且只想将最新事件保留在内存中,则环形缓冲区目标非常有用。文件目标允许您指定最大文件大小和翻转文件数。如果您捕获了很多事件,我建议使用文件目标。

您可以使用SSMS对象资源管理器创建跟踪,然后根据应用程序需要生成脚本。

CREATE EVENT SESSION [batch_and_rpc] ON SERVER 
ADD EVENT sqlserver.rpc_starting(
    WHERE ([sqlserver].[client_hostname]=N'ServerName')),
ADD EVENT sqlserver.rpc_completed(
    WHERE ([sqlserver].[client_hostname]=N'ServerName')),
ADD EVENT sqlserver.sql_batch_starting(
    WHERE ([sqlserver].[client_hostname]=N'ServerName')),
ADD EVENT sqlserver.sql_batch_completed(
    WHERE ([sqlserver].[client_hostname]=N'ServerName'))
ADD TARGET package0.event_file(SET filename=N'C:\TraceFiles\batch_and_rpc.xel'),
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

ALTER EVENT SESSION [batch_and_rpc] ON SERVER STATE = START;
GO

SELECT * 
FROM sys.fn_xe_file_target_read_file('C:\TraceFiles\batch_and_rpc*.xel', null, null, null);
GO

要删除XE会话:

DROP EVENT SESSION [batch_and_rpc] ON SERVER; 

您还可以使用Microsoft.SqlServer.XEvent命名空间中的对象读取XE数据。但请注意,该方法没有详细记录。请参阅http://blogs.msdn.com/b/extended_events/archive/2011/07/20/introducing-the-extended-events-reader.aspx