原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtmlhtml
在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
图 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 查看性能计数器日志
关联性能计数器日志和SQL事件探查器跟踪信息进行深刻的分析
经过SQL事件探查器能够找出哪些SQL执行时间过长,但它却不能给出致使执行时间过长的上下文信息,但性能监视工具能够提供独立组件的性能统计数据(即上下文信息),它们正好互补。
若是相同的查询在生产库和测试库上的执行时间差异过大,那说明测试服务器的负载,环境和查询执行上下文都和生产服务器不同,所以须要一种方法来模拟生产服务器上的查询执行上下文,这时就须要结合SQL事件探查器的跟踪信息和性能监视工具的性能计数器日志。
将两者结合起来分析能够更容易找出性能问题的根本缘由,例如,你可能发如今生产服务器上每次查询都须要10秒,CPU利用率达到了100%,这时就应该放下SQL调优,先调查一下为何CPU利用率会上升到100%。
关联SQL事件探查器跟踪信息和性能计数器日志的步骤以下:
1)建立性能计数器日志,包括下列常见的性能计数器,指定“手动”方式启动和中止计数器日志:
--网络接口\输出队列长度
--处理器\%处理器时间
--SQL Server:缓冲管理器\缓冲区缓存命中率
--SQL Server:缓冲管理器\页面生命周期
--SQL Server:SQL统计\批量请求数/秒
--SQL Server:SQL统计\SQL 编译
--SQL Server:SQL统计\SQL 从新编译/秒
建立好性能计数器日志,但不启动它。
2)使用SQL事件探查器TSQL Duration模板建立一个跟踪,添加“开始时间”和“结束时间”列跟踪,同时启动事件探查器跟踪和前一步建立的性能计数器日志;
3)跟踪到足够信息后,同时停掉SQL事件探查器跟踪和性能计数器日志,将SQL事件探查器跟踪信息保存为一个.trc文件;
4)关闭SQL事件探查器跟踪窗口,再使用事件探查器打开.trc文件,点击“文件”*“导入性能数据”关联性能计数器日志,此时会打开一个文件浏览器窗口,选择刚刚保存的性能计数器日志文件进行关联;
5)在打开的窗口中选择全部计数器,点击“肯定”,你将会看到下图所示的界面,它同时显示SQL事件探查器的跟踪信息和性能计数器日志;
图 28 关联SQL事件探查器和性能监视工具输出
6)在事件探查器跟踪信息输出中选择一条TSQL,你将会看到一个红色竖条,这表明这条TSQL执行时相关计数器的统计数据位置,一样,点击性能计数器日志输出曲线中高于正常值的点,你会看到对应的TSQL在SQL事件探查器输出中也是突出显示的。
我相信你学会如何关联这两个工具的输出数据后,必定会以为很是方便和有趣。
小结
诊断SQL Server性能问题的工具和技术有不少,例如查看SQL Server日志文件,利用调优顾问(DTA)得到调优建议,不管使用哪一种工具,你都须要深刻了解内部的细节缘由,只有找出最根本的缘由以后,解决性能问题才会驾轻就熟。
本系列最后一篇将介绍如何优化数据文件和应用分区。
优化技巧主要是面向DBA的,但我认为即便是开发人员也应该掌握这些技巧,由于不是每一个开发团队都配有专门的DBA的。