为服务器端跟踪设置过滤

mar*_*c_s 6 sql-server-2008-r2

我正在尝试在 SQL Server 2008 R2 中设置服务器端跟踪。虽然我可以轻松选择事件和数据列,但过滤似乎有点奇怪......

我试图对 SQL 批处理或存储过程的持续时间设置过滤(过滤任何 >= 1000 毫秒),但我也想过滤所涉及的数据库名称

当我将跟踪定义从 SQL Profiler 导出到*.sql文件时,我似乎没有找到对数据库名称的任何过滤:

-- lots of other stuff up here - setting up trace events and so on...

-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - 100479e4-6eeb-4608-af17-64141f1631ec'
set @bigintfilter = 1000000
exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter

....
Run Code Online (Sandbox Code Playgroud)

那是怎么回事?为什么我可以指定要过滤的数据库名称 - 但跟踪定义最终不包含它?

  • 这是否意味着服务器端跟踪始终只检查它在其中创建的数据库?
  • 但是为什么我可以按数据库名称指定过滤器?
  • 这是否也意味着无法对例如死锁进行跨数据库服务器范围的跟踪?

更新:经过一番折腾,我得出以下结论:

  • Create Trace在我的情况下,数据库名称的过滤器未应用于脚本,因为我最终只选择了Locks / Deadlock Graph事件 - 而该事件不会将 aDatabase Name作为事件列公开

  • 如果我选择其他事件一样,RPC completed暴露了Database Name作为一个事件列,我可以过滤的Database Name,并且过滤器也被适当地加入到Create Trace脚本。

我不知道我是如何在 上实际定义过滤器的Database Name,因为通常情况下,如果事件不公开列,则该列在Column filter对话框中也不可用....

无论如何 - 无论出于何种原因(至少现在),Deadlock Graph都不会公开Database Name,因此我也无法过滤该属性....

感谢所有帮助并提供有见地的评论!

Tho*_*ger 4

这是否意味着服务器端跟踪始终只检查它所创建的数据库?

不,服务器端跟踪的范围仅限于:服务器。当我创建(我认为是)确切的跟踪定义并将其导出时,我得到以下片段:

-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

set @bigintfilter = 1000000
exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter

exec sp_trace_setfilter @TraceID, 35, 0, 6, N'AdventureWorks'
-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1
Run Code Online (Sandbox Code Playgroud)

我也在使用 SQL Server Profiler 2008 R2。如果您不过滤数据库名称,那么您将捕获所有实例数据库的跟踪事件。至于为什么你的导出似乎不包括过滤器的那部分,我不能肯定地说。我知道这是不言而喻的,但在导出之前我会在 Profiler 中检查您的跟踪定义,以确保数据库名称实际上作为过滤器包含在内(同样,我知道您可能已经对此进行了两次和三次检查,但我有说出来)。

  • 没问题!乐意效劳。这绝对是奇怪的行为,也是对我们所有人的一个很好的提醒,我们需要完全按照您所做的那样:检查 GUI 脚本的内容。 (2认同)