23ee 发表于 2014-7-18 10:22:24

使用SQL Nexus整合----定制SQL Nexus

这节介绍如何定制SQL Nexus及RML Utilities,来帮助你进行分析或重做数据分析。包含如下内容:

[*]使用ReadTrace.exe导入SQL Trace文件
[*]为SQL Nexus创建定制报告
[*]使用命令行选项运行SQL Nexus
[*]写自定义T-SQL查询以便更快速地进行数据分析
[*]使用OSTRESS.EXE在SQL Server实例上运行压力测试
使用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文件的一些常见必需参数的默认值如下面说明:

[*]-o----------在当前路径下生存输出文件,除非另指定
[*]-S----------如果-S参数未指定,那么默认选项是连接默认的SQL Server实例
[*]-d----------把SQL Trace数据装载进一个叫PerfAnalysis的数据库,除非显式指定数据库名称
[*]-E----------连接时使用Windows授权,除非另指定
其中一种情况,即当你分析一个死锁时,你或许需要单独使用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,来添加或修改你想要的数据类型。在使用定制行集时,要记住如下要点:

[*]如果在收集的结果集中有超过varchar(8000)的数据,那么在导入数据之前要确保修改TextRowsetsCustom.xml文件。
[*]为你收集的每个行集提供一个唯一的标识符。你不会想让Importer混合搭配你要导入的数据。
[*]使用GETDATE()添加一个运行时列,或者在一个循环里为脚本抓取数据添加一个变量,以便更容易地追踪趋势,而不预言。
[*]结果集中收集的所有的列都必须命名。
[*]在结果集中避免CR/LFs (Carriage Returns/Line Feeds回车/换行),例如不要使用CHAR(13),因为这会严重误导Importer,因为它会把CR/LFs看成是行末指示符。
[*]要么通过Management Studio运行数据采集脚本直接把数据抓取到一个文件,要么使用sqlcmd -W参数,如果你使用sqlcmd抓取数据。-W会确保移除结果集中的结尾空格。
写自定义查询
你可以写自定义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
[*]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参数区分大小写
[*]参数必须用(-)或斜杠(/)隔开
[*]包含空格或特殊字符的参数应该放在双引号里
[*]参数指示符和值之间不允许有空格
OSTRESS让你可以指定连接数及特定查询(或RML文件里的查询)的迭代次数。下面的例子对默认实例执行SELECT @@VERSION,使用50个线程,100次迭代:
Ostress.exe -Q"Select @@VERSION" -oc:\temp\output -n50 -r100
在RML Utilities命令提示中使用ostress.exe -?将会返回其可用的参数列表。

页: [1]
查看完整版本: 使用SQL Nexus整合----定制SQL Nexus