这节介绍如何定制SQL Nexus及RML Utilities,来帮助你进行分析或重做数据分析。包含如下内容:
使用ReadTrace.exe
SQL Nexus可以把每个SPID的活动分解到单独的.trc文件,但是这些文件仅指向%TEMP%\RML文件夹。你有两个选择:把%TEMP%路径改到不同的磁盘或使用ReadTrace.exe生成.trc文件到所需的路径。第一个选择有点疯狂,因为它会影响用户上下文下运行的所有应用程序。有时,可用磁盘空间不够容纳ReadTrace.exe产生的Trace文件。这就需要使用命令行选项,RML Utilities提供的第三种选择可以在导入数据时添加SPID、Hostname及Application过滤,以减少ReadTrace.exe产生的Trace文件。可以在RML Utilities命令提示下访问ReadTrace.exe。使用ReadTrace导入SQL Trace文件的一些常见必需参数的默认值如下面说明:
其中一种情况,即当你分析一个死锁时,你或许需要单独使用ReadTrace.exe来把SQL Trace数据导入SQL Nexus数据库。分析死锁时,死锁图表不能充分确定为何session仍然占用锁,为何session起初需要锁定那个对象。这时,你需要追踪该session执行的语句的顺序。要做到这点,你可以使用如下命令导入涉及死锁的session的数据。这条命令将SQL Trace数据导入到一个名叫dbRMLUtilDemo的数据库,过滤条件是SPID 53和55相关的活动:
readtrace -S. -E -ddbRMLUtilDemo -I"D:\RML\RMLUtil_demo.trc" -A"!SQLCMD" -s53 -s55 -MF -o"D:\RML\output" -f
上面这条命令也可以排除通过SQLCMD实用工具执行的查询所生成的事件,SQLCMD工具是PSSSIAG或SQLDIAG用于执行T-SQL查询收集诊断数据的工具。另外,每个SPID/Session ID的单独的trace文件将会生成到D:\RML\output文件夹中。你也可以使用-H参数添加hostname过滤条件。
注意,你可以通过RML Utilities命令提示使用Readtrace.exe /?来查看可用的参数,或使用RML Utilities Help文档来获取参数列表。
为SQL Nexus创建定制报告
你可以使用SQL Nexus数据库中的表创建定制报告。报告结构本身很简单。它使用共享数据源sqlnuxus.rds,因此,当你使用SQL Nexus工具的下拉菜单改变数据库名称时,可以切换数据库上下文。一旦你建好定制报告,你就可以把它放在%appdata%\SQLNexus\Reports下面。SQL Nexus启动后,会自动获取这些报告。如果你熟悉SSRS设计报表,那么这对于你来说就小菜一碟。你可以使用VS Reporting Serveices项目创建报告。当你创建报告项目时,你需要确认目标Server版本,要设置为SQL Server 2008/R2或以上版本。
使用命令提示运行SQL Nexus
这个选项很少使用,但是在自动化诊断数据分析时却非常有用。在命令提示窗口使用sqlnexus.exe /?会返回该工具所能接受的命令行参数列表。下面的命令会获取C:\temp\sqldiag\output下面的文件,并把把诊断数据导入到sqlnuxus_cmd数据库。把诊断数据导入到数据库后,/X会引起SQL Nexus退出。
Sqlnexus.exe /S. /D"sqlnexus_cmd" /E /I"C:\temp\sqldiag\output" /X
记住,你最后一次在GUI运行SQL Nexus时保存的设置要在指定命令行选项时使用。
在SQL Nexus数据库中创建自定义表
假定你决定收集一个T-SQL脚本的输出,而该脚本不是Pssdiag和Sqldiag Manager自带的默认采集器的一部分。收集诊断数据后,你需要使用喜欢的文本编辑器手动地钻研文本数据,来为你正在解决的问题创建有用的假设。SQL Nexus可以把数据导入到表中,让你能够查询导入的数据并节省你宝贵的时间。
Rowset Importer负责把数据从文本文件导入到SQL Nexus数据库。SQL Nexus通过Edit Custom Rowset选项将这项功能扩展到其他包含诊断数据的文本文件,在工具的主页面的左侧可以看到这个选项。图12-19显示了Manage Custom Rowset对话窗口,点击Edit Custom Rowset链接时可以启动它。
这里你可以指定需要导入数据的表名(Rowset Name)和identifier。Identifier是最重要的关键字,因为它让Rowset Importer知道如何识别你想导入的数据。这意味着,当你在创建定制行集时,在SELECT查询把诊断数据导入输出文件之前,应该通过PRINT语句提前把你指定的Identifier名字输出。对于图12-19中所示的例子,诊断查询的输出将事先用如下命令完成:
print '—RequestsRowset'
如果你视图导入查询输出,有数据类型长度大于8000的列,导入会失败,在SQL Nexus日志文件中会有如下错误:
SQLNexus Information: 0: RowsetImportEngine Error: An unexpected error has occurred: System.Data.SqlClient.SqlException: The size (8192) given to the column 'query_text' exceeds the maximum allowed for any data type (8000).
SQL Nexus 3.0.0没有提供选项让你能够使用UI添加自定义列数据类型。你在Manage Custom Rowset对话框里定义定制行集会把所有列视为varchar类型。要改变这种行为,可以直接修改C:\Users\<user name>\AppData\Roaming\sqlnexus\TextRowsetsCustom.xml,来添加或修改你想要的数据类型。在使用定制行集时,要记住如下要点:
写自定义查询
你可以写自定义T-SQL查询来获取并汇总SQL Nexus表中的数据。下面的查询返回一个聚合,SUM所有的CPU/Duration/Reads/Writes:
select a.hashid,b.OrigText, SUM(a.duration) as SumDuration, SUM(a.Reads) as SumReads, SUM(a.Writes) as SumWrites, SUM(a.CPU) as SumCPU, MAX(a.duration) as MAXDuration, MAX(a.Reads) as MAXReads, MAX(a.Writes) as MAXWrites, MAX(a.CPU) as MAXCPU, MIN(a.duration) as MINDuration, MIN(a.Reads) as MINReads, MIN(a.Writes) as SumWrites, MIN(a.CPU) as MINCPU, AVG(a.duration) as AVGDuration, SUM(a.Reads) as AVGReads, Sum(a.Writes) as AVGWrites, SUM(a.CPU) as AVGCPU, GROUPING(a.hashid) as [GroupNo] from readtrace.tblBatches a inner join readtrace.tblUniqueBatches b on a.HashID = b.HashID where EndTime is not null group by a.hashid,b.OrigText WITH ROLLUP
如果你感觉冒险,那么你可以随意写查询切分SQL Nexus表中的数据。这不仅有助于减少数据分析期间执行重复的任务所需的时间量,还有助于帮你熟悉表架构。一旦你熟悉SQL Nexus数据库中的表架构,那么如果所需数据都已经抓取到,你就会发现解决常见SQL Server性能问题并不是一件令人怯步的任务。常言道,知此知彼(As they often say, knowing is half the battle!)。
OSTRESS可执行程序
OSTRESS是一个可扩展的基于ODBC的应用程序,它可以施压或回放(replay)数据库命令。你可以指定一个查询,通过一个命令行参数,.SQL脚本或.RML文件。Replay模式使用.RML文件,有ReadTrace生成,因为它处理SQL Server trace文件。工具,如SQLCMD或OSQL,不能落实压力测试,因为它需要为每个线程配备一个单独的进程,并且很难控制。如果你不想写自定义压力测试代码,那么RML Utilities自带的OSTRESS可执行程式就是一个很好的选择。Distributed Replay Client是SQL Server 2012的一个新功能,也很有用,但是如果你没有为SQL Server 2012实例配置Distributed Replay,那么OSTRESS是一个非常有用的工具。它是一个基于命令行的工具,你可以把它作为自动化处理的一部分,或者测试脚本的一部分。
下面的代码过滤Session ID 51、52及53,并排除SQLDIAG或主机MyLaptop产生的事件。输出文件夹包含SPID 51、52和53的.RML文件,可以使用OSTRESS产生负载:
readtrace -S. -E -ddbRMLUtilDemo -I"D:\RML\RMLUtil_demo.trc" -A"!SQLCMD" –s51 –s52 -s53 -o"D:\RML\output" –H"!MyLaptop" –A"!SQLDIAG
除压力测试之外,你或许想插入随机事件。OSTRESS对于再现查询超时或查询取消也很有帮助。RML Utilities Help文件对该工具有详细的文档说明。关于OSTRESS,要记住如下:
OSTRESS让你可以指定连接数及特定查询(或RML文件里的查询)的迭代次数。下面的例子对默认实例执行SELECT @@VERSION,使用50个线程,100次迭代:
Ostress.exe -Q"Select @@VERSION" -oc:\temp\output -n50 -r100
在RML Utilities命令提示中使用ostress.exe -?将会返回其可用的参数列表。