技术开发 频道

十步优化SQL Server中的数据访问

  有效利用SQL事件探查器排除与性能相关的问题

  SQL事件探查器除了可以用于找出执行成本最高的那些TSQL或存储过程外,还可以利用它许多强大的功能诊断和解决其它不同类型的问题。当你收到一个性能问题报告后,或者想提前诊断潜在的性能问题时都可以使用SQL事件探查器。下面是一些SQL事件探查器使用技巧,或许对你有帮助。

  1)使用现有的模板,但需要时应创建你自己的模板

  大多数时候现有的模板能够满足你的需求,但当诊断一个特殊类型的数据库性能问题时(如数据库发生死锁),你可能需要创建自己的模板,在这种情况下,你可以点击“文件”*“模板”*“新建模板”创建一个新模板,需要指定模板名、事件和列。当然也可以从现有的模板修改而来。

  图 7 创建一个新模板

  图 8 为新模板指定事件和列

  2)捕捉表扫描(TableScan)和死锁(DeadLock)事件

  没错,你可以使用SQL事件探查器监听这两个有趣的事件。

  先假设一种情况,假设你已经在你的测试库上创建了合适的索引,经过测试后,现在你已经将索引应用到生产服务器上了,但由于某些不明原因,生产数据库的性能一直没达到预期的那样好,你推测执行查询时发生了表扫描,你希望有一种方法能够检测出是否真的发生了表扫描。

  再假设另一种情况,假设你已经设置好了将错误邮件发送到一个指定的邮件地址,这样开发团队可以第一时间获得通知,并有足够的信息进行问题诊断。某一天,你突然收到一封邮件说数据库发生了死锁,并在邮件中包含了数据库级别的错误代码,你需要找出是哪个TSQL创造了死锁。

  这时你可以打开SQL事件探查器,修改一个现有模板,使其可以捕捉表扫描和死锁事件,修改好后,启动事件探查器,运行你的应用程序,当再次发生表扫描和死锁事件时,事件探查器就可以捕捉到,利用跟踪信息就可以找出执行代价最高的TSQL。

  注意:从SQL Server日志文件中可能也可以找到死锁事件记录,在某些时候,你可能需要结合SQL Server日志和跟踪信息才能找出引起数据库死锁的数据库对象和TSQL。

  图 9 检测表扫描

  图 10 检测死锁

  3)创建重放跟踪

  某些时候,为了解决生产数据库的性能问题,你需要在测试服务器上模拟一个生产环境,这样可以重演性能问题。使用SQL事件探查器的TSQL_Replay模板捕捉生产库上的事件,并将跟踪信息保存为一个.trace文件,然后在测试服务器上播放跟踪文件就可以重现性能问题是如何出现的了。

  图 11 创建重放跟踪

  4)创建优化跟踪

  数据库调优顾问是一个伟大的工具,它可以给你提供很好的调优建议,但要真正从它那获得有用的建议,你需要模拟出与生产库一样的负载,也就是说,你需要在测试服务器上执行相同的TSQL,打开相同数量的并发连接,然后运行调优顾问。SQL事件探查器的Tuning模板可以捕捉到这类事件和列,使用Tuning模板运行事件探查器,捕捉跟踪信息并保存,通过调优顾问使用跟踪文件在测试服务器上创建相同的负载。

  图 12 创建Tuning事件探查器跟踪

  5)捕捉ShowPlan在事件探查器中包括SQL执行计划

  有时相同的查询在测试服务器和生产服务器上的性能完全不一样,假设你遇到这种问题,你应该仔细查看一下生产数据库上TSQL的执行计划。但问题是现在不能在生产库上执行这个TSQL,因为它已经有严重的性能问题。这时SQL事件探查器可以派上用场,在跟踪属性中选中ShowPlan或ShowPlan XML,这样可以捕捉到SQL执行计划和TSQL文本,然后在测试服务器上执行相同的TSQL,并比较两者的执行计划。

  图 13 指定捕捉执行计划

  图 14 在事件探查器跟踪中的执行计划

2
相关文章