数据库优化实践【性能检测工具篇】
诊断数据库性能问题就象医生诊断病人病情一样,既要结合自己积累的经验,又要依靠科学的诊断报告,才能准确地判断问题的根源在哪里。前面三篇文章我们介绍了许多优化数据库性能的方法,固然掌握优化技巧很重要,但诊断数据库性能问题是优化的前提,本文就介绍一下如何诊断数据库性能问题。
第八步:使用SQL事件探查器和性能监控工具有效地诊断性能问题
在SQL Server应用领域SQL事件探查器可能是最著名的性能故障排除工具,大多数情况下,当得到一个性能问题报告后,一般首先启动它进行诊断。
你可能已经知道,SQL事件探查器是一个跟踪和监控SQL Server实例的图形化工具,主要用于分析和衡量在数据库服务器上执行的TSQL性能,你可以捕捉服务器实例上的每个事件,将其保存到文件或表中供以后分析。例如,如果生产数据库速度很慢,你可以使用SQL事件探查器查看哪些存储过程执行时耗时过多。
SQL事件探查器的基本用法
你可能已经知道如何使用它,那么你可以跳过这一小节,但我还是要重复一下,也许有许多新手阅读本文。
1)启动SQL事件探查器,连接到目标数据库实例,创建一个新跟踪,指定一个跟踪模板(跟踪模板预置了一些事件和用于跟踪的列),如图1所示;
图 1 选择跟踪模板
2)作为可选的一步,你还可以选择特定事件和列
图 2 选择跟踪过程要捕捉的事件
3)另外你还可以点击“组织列”按钮,在弹出的窗口中指定列的显示顺序,点击“列过滤器”按钮,在弹出的窗口中设置过滤器,例如,通过设置数据库的名称(在like文本框中),只跟踪特定的数据库,如果不设置过滤器,SQL事件探查器会捕捉所有的事件,跟踪的信息会非常多,要找出有用的关键信息就如大海捞针。
图 3 过滤器设置
4)运行事件探查器,等待捕捉事件
图 4 运行事件探查器
5)跟踪了足够的信息后,停掉事件探查器,将跟踪信息保存到一个文件中,或者保存到一个数据表中,如果保存到表中,需要指定表名,SQL Server会自动创建表中的字段。
图 5 将探查器跟踪数据保存到表中
6)执行下面的SQL查询语句找出执行代价较高的TSQL
Duration DESC
图 6 查找成本最高的TSQL/存储过程
有效利用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 在事件探查器跟踪中的执行计划
使用性能监视工具(PerfMon)诊断性能问题
当你的数据库遇到性能问题时,大多数时候使用SQL事件探查器就能够诊断和找出引起性能问题的背后原因了,但有时SQL事件探查器并不是万能的。
例如,在生产库上使用SQL事件探查器分析查询执行时间时,对应的TSQL执行很慢(假设需要10秒),但同样的TSQL在测试服务器上执行时间却只要200毫秒,通过分析执行计划和数据列,发现它们都没有太大的差异,因此在生产库上肯定有其它问题,那该如何揪出这些问题呢?
此时性能监视工具(著名的PerfMon)可以帮你一把,它可以定期收集硬件和软件相关的统计数据,还有它是内置于Windows操作系统的一个免费的工具。
当你向SQL Server数据库发送一条TSQL语句,会产生许多相关的执行参与者,包括TSQL执行引擎,服务器缓存,SQL优化器,输出队列,CPU,磁盘I/O等,只要这些参与者任何一环执行节奏没有跟上,最终的查询执行时间就会变长,使用性能监视工具可以对这些参与者进行观察,以找出根本原因。
使用性能监视工具可以创建多个不同的性能计数器,通过图形界面分析计数器日志,此外还可以将性能计数器日志和SQL事件探查器跟踪信息结合起来分析。
性能监视器基本用法介绍
Windows内置了许多性能监视计数器,安装SQL Server时会添加一个SQL Server性能计数器,下面是创建一个性能计数器日志的过程。
1)在SQL事件探查器中启动性能监视工具(“工具”*“性能监视器”);
图 15 启动性能监视工具
2)点击“计数器日志”*“新建日志设置”创建一个新的性能计数器日志
图 16 创建一个性能计数器日志
指定日志文件名,点击“确定”。
图 17 为性能计数器日志指定名字
3)点击“添加计数器”按钮,选择一个需要的计数器
图 18 为性能计数器日志指定计数器
4)从列表中选择要监视的对象和对应的计数器,点击“关闭”
图 19 指定对象和对应的计数器
5)选择的计数器应显示在窗体中
图 20 指定计数器
6)点击“日志文件”标签,再点击“配置”按钮,指定日志文件保存位置,如果需要现在还可以修改日志文件名
图 21 指定性能计数器日志文件保存位置
7)点击“调度”标签,指定一个时间读取计数器性能,写入日志文件,也可以选择“手动”启动和停止计数器日志。
图 22 指定性能计数器日志运行时间
8)点击“常规”标签,指定收集计数器数据的间隔时间
图 23 设置计数器间隔采样时间
9)点击“确定”,选择刚刚创建的计数器日志,点击右键启动它。
图 24 启动性能计数器日志
10)为了查看日志数据,再次打开性能监视工具,点击查看日志图标(红色),在“源”标签上选中“日志文件”单选按钮,点击“添加”按钮添加一个日志文件。
图 25 查看性能计数器日志
11)默认情况下,在日志输出中只有三个计数器被选中,点击“数据”标签可以追加其它计数器。
图 26 查看日志数据时追加计数器
12)点击“确定”,返回图形化的性能计数器日志输出界面
图 27 查看性能计数器日志