尽管 SQL Server 2005 在增强 DBA 对数据库引擎进行故障排除的能力方面取得了长足进步,但仍存在许多 DBA 几乎无法有效进行故障排除的情况。一个经常被引用的示例就是某些查询会使用过量的 CPU 资源,但 DMV 却无法提供足够的信息来确定究竟是哪些查询导致了这些问题。但与 SQL Server 2005 不同,SQL Server 2008 可通过一个名为 SQL Server 扩展事件的新功能来突破此类限制。
Microsoft 内部的各种团队也提供了许多有用的性能故障排除工具,如 SQLdiag 实用工具、SQL Server RML 实用工具、SQL Server 2005 性能仪表板报告和DMVStats。此外还有用于 SQL Server 2005 的Windows 事件跟踪 (ETW) 提供程序,它可将 SQL Trace 事件与 Windows 其它部分中的事件集成在一起。
扩展事件
扩展事件系统的功能远远超出了 SQL Server 在以前提供的任何事件跟踪和故障排除机制。在我看来,扩展事件系统具有如下特色:
· 事件同步触发,但可同步或异步进行处理。
· 任何目标都可以消耗任何事件,而任何动作都可以与任何事件配对,从而能够更深入地监控系统。
· “智能”谓词允许您使用布尔逻辑来构建复杂的规则。
· 可以使用 Transact-SQL 对扩展事件会话进行全面控制。
· 可以监控性能关键代码而不会对性能产生影响。
· 在深入讲述之前,我先花一些时间来定义一些新术语。
事件 事件是指代码中定义的点。此类示例包括:T-SQL 语句完成执行时的点或结束获取锁定时的点。每个事件都有一个定义的负载(该事件返回的列的集合),它是使用 ETW 模型(其中每个事件都返回一个通道和关键字作为负载的一部分)来定义的,以便能够与 ETW 集成。SQL Server 2008 最初提供 254 个定义的事件,预计在今后还会增加。
使用下列代码可以查看这些定义事件的列表:
FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE xp.[guid] = xo.[package_guid]
AND xo.[object_type] = 'event'
ORDER BY xp.[name];
使用下列代码可以查找某个特定事件的负载:
WHERE [object_name] = 'sql_statement_completed';
GO
请注意,扩展事件系统包含一组说明性的 DMV,用来描述所有事件、目标等。有关详细内容,请参阅“SQL Server 扩展事件动态管理视图。”
谓词 谓词是指在事件消耗前利用一组逻辑规则来筛选事件的方法。谓词可以很简单,如检查事件负载中的其中一个返回列是否为某个特定值(例如,通过对象 ID 来筛选“锁定-获得”事件)。
它们还具有一些高级功能,如统计会话期间某个特定事件发生的次数、仅允许事件在发生一次后消耗,或者动态更新谓词本身以抑制包含类似数据的事件的消耗。
谓词可以使用布尔逻辑来编写,以使其能够尽可能走捷径。这使得只需执行最少数量的同步处理即可确定是否需要消耗事件。
动作 动作是指在消耗某个事件前同步执行的一组命令。任何动作都可以被链接到任何事件。它们通常会收集大量数据并追加到事件负载中(如 T-SQL 堆栈或查询执行计划)或执行某个被追加到事件负载中的计算。
由于执行这些动作可能需要极高的代价,因此事件的动作仅在所有谓词都计算完毕后才执行,如果在随后确定该事件不会被消耗,则将不会有同步执行某个动作的点。使用下列代码可找到预定义动作的列表:
FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE xp.[guid] = xo.[package_guid]
AND xo.[object_type] = 'action'
ORDER BY xp.[name];