技术开发 频道

SQL Server用扩展事件进行高级故障排除

    【IT168 技术文档】全世界的 SQL Server DBA 都有一个似乎永远无法解决的难题:故障排除,其中所执行的绝大多数故障排除都是为了查找某种性能问题。即使是最精心构建并经过测试的应用程序系统都会随着时间的推移发生变化,进而导致可能出现重大的性能问题。

  例如,工作负载可能会发生变化(如并发用户的数量、需要执行的查询数以及需要运行的新月末报告)、需要处理的数据量可能会增加、运行系统的硬件平台可能会发生变化(如处理器内核数量、可用的服务器内存数量以及 I/O 子系统容量),另外还可能引入新的并发工作负载(如事务复制、数据库镜像以及更改数据捕获)。

  但这些并不是问题的全部。在设计和测试应用程序系统时,设计中往往会出现很多意外的问题,这些也都需要进行故障排除。显然,无论在应用程序生命周期的哪个阶段发现问题,都必须通过故障排除来找出原因并给出解决方案。

  在一个复杂的应用程序系统中,可能会有许多需要进行分析的硬件和软件组件,但我关注的只是 SQL Server。抛开各种性能故障排除方法不谈(这些属于本文以外的内容),您对 SQL Server 进行故障排除时都需要哪些工具呢?

  SQL Server 2005 中的故障排除

  在最近的几个 SQL Server 版本中,可用于性能故障排除的工具大为增加。SQL Server 包含大量的 DBCC(数据库控制台命令)命令,可用于深入了解数据库引擎各个部分的当前状况。此外还包括 SQL Server Profiler,它可以通过编程的方式使用底层 SQL Trace 机制。

  尽管 SQL Server 为进行故障排除不断加以改进,但这些选择依然存在某些问题。DBCC 输出的后处理显得有些笨拙,因为必须先将输出结果转储到一个临时表中然后才能对其进行操作。而且,如果配置不当,在运行 SQL Trace/Profiler 时可能会导致性能急剧降低(例如在某个繁忙系统中跟踪所有“Lock:Acquired”(锁定:获得)和“Lock:Released”(锁定:释放)事件但却忘记筛选该事件的 DatabaseId 和 ObjectId 列)。图 1 中的屏幕快照显示的是用于配置筛选器以进行新跟踪的对话框。

1

  图 1 在 SQL Server 2008 Profiler 中配置筛选器

  SQL Server 2005 添加了动态管理视图和函数(统称为 DMV)帮助从数据库引擎获取信息。DMV 废弃了某些 DBCC 命令、系统表和存储过程,同时公开了许多新的引擎工作区域。这些 DMV 是一些功能强大且可以组合的命令,可用在复杂的 T-SQL 语句中以筛选 DMV 结果并进行后处理。

  例如,图 2 中所示的代码只返回数据库中所有索引的叶级碎片和页密度(均已圆整),它还包括一个碎片级筛选器。使用原来的 DBCC SHOWCONTIG 命令则很难实现这一点。(有关 DMV 的详细信息,请参阅“动态管理视图和函数 (Transact-SQL)。”此外,SQL Server 2005 还添加了大量可用于故障排除的其它功能,包括 DDL(数据定义语言)触发器和事件通知。

  图 2 使用 DMV 获取功能强大的结果

SELECT
  OBJECT_NAME (ips.[object_id])
AS 'Object Name',
  si.name AS 'Index Name',
  ROUND (ips.avg_fragmentation_in_percent, 2) AS 'Fragmentation',
  ips.page_count AS 'Pages',
  ROUND (ips.avg_page_space_used_in_percent, 2) AS 'Page Density'
FROM sys.dm_db_index_physical_stats (
  DB_ID (
'SQLskillsDB'), NULL, NULL, NULL, 'DETAILED') ips
CROSS APPLY sys.indexes si
WHERE
  si.object_id
= ips.object_id
  
AND si.index_id = ips.index_id
  
AND ips.index_level = 0 -- only the leaf level
  
AND ips.avg_fragmentation_in_percent > 10; -- filter on fragmentation
GO

 点击查看更多TechNet精彩文章

0
相关文章