您的位置:首页 > 数据库

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

2014-04-22 14:20 393 查看
这节介绍如何定制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 [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参数区分大小写
参数必须用(-)或斜杠(/)隔开
包含空格或特殊字符的参数应该放在双引号里
参数指示符和值之间不允许有空格

OSTRESS让你可以指定连接数及特定查询(或RML文件里的查询)的迭代次数。下面的例子对默认实例执行SELECT @@VERSION,使用50个线程,100次迭代:

Ostress.exe -Q"Select @@VERSION" -oc:\temp\output -n50 -r100

在RML Utilities命令提示中使用ostress.exe -?将会返回其可用的参数列表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: