我正在尝试使用 SQL Profiler (SQL 2008)解决此问题
在生产中运行跟踪几天后,最终错误再次发生,现在我正在尝试诊断原因。问题是跟踪有 400k 行,其中 99.9% 来自“报告服务器”,我什至不知道它为什么会打开,但它似乎每秒都在 ping SQL Server...
有没有办法从跟踪中过滤掉一些记录,以便能够查看其余记录?
我可以使用当前的 .trc 文件执行此操作,还是必须再次运行跟踪?
是否有其他应用程序可以查看可以为我提供此功能的 .trc 文件?
我正在尝试使用 SQL Profiler (SQL 2008)解决此问题
在生产中运行跟踪几天后,最终错误再次发生,现在我正在尝试诊断原因。问题是跟踪有 400k 行,其中 99.9% 来自“报告服务器”,我什至不知道它为什么会打开,但它似乎每秒都在 ping SQL Server...
有没有办法从跟踪中过滤掉一些记录,以便能够查看其余记录?
我可以使用当前的 .trc 文件执行此操作,还是必须再次运行跟踪?
是否有其他应用程序可以查看可以为我提供此功能的 .trc 文件?
您可以将捕获的跟踪加载到 SQL Server Profiler:使用 SQL Server Profiler 查看和分析跟踪。
或者,您可以加载到ClearTrace(免费版)之类的工具中来执行工作负载分析。
您可以加载到 SQL Server 表中,如下所示:
SELECT * INTO TraceTable
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default)
然后你可以运行一个查询来聚合数据,比如这个:
SELECT
COUNT(*) AS TotalExecutions,
EventClass,
CAST(TextData as nvarchar(2000)) ,
SUM(Duration) AS DurationTotal ,
SUM(CPU) AS CPUTotal ,
SUM(Reads) AS ReadsTotal ,
SUM(Writes) AS WritesTotal
FROM
TraceTable
GROUP BY
EventClass,
CAST(TextData as nvarchar(2000))
ORDER BY
ReadsTotal DESC
另请参阅:MS SQL Server 2008 - 如何记录和查找最昂贵的查询?
在开始之前为捕获的跟踪设置过滤器也很常见。例如,一个常用的过滤器是只限制需要超过一定数量读取的事件,比如 5000。
在本地加载 .trc,然后使用保存到数据库到本地数据库,然后查询您心中的内容。
这些建议对于现有跟踪非常有用 - 如果您想在跟踪发生时对其进行过滤,您可以在开始之前在跟踪上设置事件过滤器。
根据我的经验,最有用的过滤器是应用程序名称 - 为此,您必须确保用于连接数据库的每个连接字符串都具有适当的应用程序名称值,即:
“...服务器=MYDB1;集成身份验证=SSPI;应用程序名称=MyPortal;...”
然后在新跟踪的跟踪属性中,选择事件选择选项卡,然后单击列过滤器...
选择 ApplicationName 过滤器,然后将值添加到 LIKE 以仅包括您指定的连接,即在 LIKE 字段中使用 MyPortal 将仅包括具有该应用程序名称的连接的事件。
例如,这将阻止您收集 Reporting Services 生成的所有杂物,并使后续分析更快。
还有很多其他可用的过滤器,所以如果你知道你在寻找什么,例如长执行(持续时间)或大 IO(读取、写入),那么你也可以过滤它们。
从 SQL Server 2005 开始,您可以直接从 SQL Profiler 过滤 .trc 文件内容;无需将其导入 SQL 表。只需按照此处建议的程序进行操作:
http://msdn.microsoft.com/en-us/library/ms189247(v=sql.90).aspx
附加提示:您可以使用 '%' 作为过滤器通配符。例如,如果您想按 SRV 之类的 HOSTNAME 进行过滤,则可以使用 SRV%。
在这里,您可以找到一个完整的脚本来查询默认跟踪,其中包含您可以过滤的完整事件列表:
http://zaboilab.com/sql-server-toolbox/anayze-sql-default-trace-to-investigate-instance-events
您必须查询 sys.fn_trace_gettable(@TraceFileName,default) 加入 sys.trace_events 以解码事件编号。