使用SQL Nexus整合----熟悉SQL Nexus

时间:2022-04-15 09:03:28

SQL Nexus是一个用于将SQL Trace数据、性能监视日志及T-SQL输出整合进一个单独的SQL Server数据库的工具。这章解释如何将SQLdiag收集的数据导入到一个SQL Server数据库,然后借助SQL Nexus里已存在的报表来分析它。SQL Nexus是一个免费的工具,可以从Microsoft CodePlex网站下载。SQL Nexus使用3个组件:

SQL Nexus主页有下载链接及源码,你可以发布评论并提相关的问题。

先决条件

开始使用SQL Nexus之前,注意下面要做的事项:

  • 安装Microsoft SQL Server 2008 SP1 Report Viewer控件,以便使用工具自带的客户端报表查看整合的报告;
  • 安装RML Utilities,以便SQL Nexus导入SQL Traces;
  • 如果你使用SQL Server 2012,安装SQL Server 2008 Native Client,它可以在MS下载网站获取;
  • 核实安装.NET Framework 2.0
  • 使用SQL Server 2012或更低的数据库引擎,导入采集的数据(不推荐导入到生产SQL Server实例,因为耗资源)。

一旦你满足了上述的先决条件,你就可以从http://sqlnexus.codeplex.com/下载最新的SQL Nexus,并使用sqlnexus.exe启动工具。启动后,会提示你提供SQL Server实例名及认证信息,以连接到你想导入数据的实例。该工具默认的数据库是sqlnexus。图12-1显示了SQL Nexus工具的登录页面:

使用SQL Nexus整合----熟悉SQL Nexus

图12-1显示了Tasks选项和导入数据的Import连接。点击Import选项后,就出现了如图12-2所示的Data Import对话框。SQL Nexus有3种Importer,如图12-3所示。

使用SQL Nexus整合----熟悉SQL Nexus

  • BLG Blaster----将PerfMon和sysmon文件导入到2张表([dbo].[CounterData]和[dbo].[CounterDetails])。
  • ReadTrace----使用ReadTrace.exe将数据从SQL Trace导入到SQL Nexus数据库。所有导入的SQL Trace数据均可在ReadTrace schema下看到。
  • Rowset Importer----解析T-SQL脚本输出,并将它们导入到相关的数据库表中。SQL Server Perf Stats脚本的输出组成数据块(bulk),导入到SQL Nexus数据库表。

注意,当前没有可用的报表用于导入到SQL Nexus数据库的性能计数器数据。你要么写T-SQL去查看和整合导入数据,要么创建定制报表来查看PerfMon数据。

 把数据装载到Nexus数据库

 每次启动SQL Nexus时,会显示连接SQL Server的对话框。SQL Nexus是一个“离线”分析工具,这意思是它分析的是以采集好的数据。当你连接SQL Server实例时,SQL Nexus会寻找一个叫做“sqlnexus”的数据库。如果发现了,那么恢复模式就被设置为简单,以确保不必管理事务日志。如果不存在,那么会创建一个50MB数据文件的数据库。一旦你提供了路径,点击Import按钮,这会初始化导入,相关的importer会提取、解析并把相关的数据导入到合适的表中。如果导入数据的过程中遇到任何错误或异常,你可以查看SQL Nexus日志文件,它位于%temp%/sqlnexus.000.log。万一你不能解决问题,你可以把该日志文件附在SQL Nexus CodePlex网站的Discussion/Issue Tracker页面,你也可以在该页面浏览常见问题的解答等。BLG Blaster和Rowset Importer和它们的任务直接相关,但是这里要特别提一下ReadTrace Importer。图12-4显示了ReadTrace importer的不同选项。

使用SQL Nexus整合----熟悉SQL Nexus

下面列表描述了每个选项:

  • Output trace fi les (.trc) by SPID to %TEMP%\RML------当你想提取SPID/Session ID相关的事件到单独的SQL Trace文件时,这个选项就是有帮助的。
  • Output RML fi les (.rml) to %TEMP%\RML------生成Replay Markup Language (RML)文件时有用。RML是一个类似XML格式的文件,它用于重现(replay)和OSTRESS之间的数据交换。.TRC事件被分解为一系列RML节点,这使得OSTRESS能够重现活动。
  • Assume QUOTED_IDENTIFIER ON------RML Utilities执行规范化的查询,提交给数据库引擎以便为规范的SQL Server文本生成Hash ID。如果该选项设为OFF,那么规范化解析就会由QUOTED IDENTIFIER OFF语义完成,默认为ON。
  • Ignore events associated with PSSDIAG activity------使用HOSTNAME过滤参数减少PSSDIAG执行的T-SQL查询的结果。
  • Disable event requirement checks------为了得到准确的整合数据,RML Utilities需要捕捉开始和完成的事件。如果没有抓到必要的事件,那么SQL Trace会导入失败。可以为Trace文件覆盖它,以至于这些文件可以导入到SQL Nexus数据库。
  • Enabled -T35 to support MARS------这个用于ReadTrace可执行程序的跟踪标记不是SQL Server实例跟踪标记。RML Utilities对于MARS (Multiple Active Result Sets)提供局部支持。使用的公式是[(Session Id * 10) + BatchId]。这启用基本性能分析功能。启用这个选项也会禁用RML输出处理。启用这个选项时,SQL Nexus用参数-T35和-f调用ReadTrace。

 数据默认导入一个叫sqlnexus的数据库,它是SQL Nexus连接到SQL Server实例时创建的。该数据库一次仅能存储一个实例上的诊断数据,因此每次导入时都会重建。如果你想保存之前导入的结果,你可以在下次导入前备份数据库,或者为每次导入创建一个新的数据库。你可以通过右上角的下拉框,选择New Database选项创建,如图12-5所示:

使用SQL Nexus整合----熟悉SQL Nexus

如果你想把诊断数据导入到已经有Nexus数据的数据库,就会提示覆盖数据库。此时,你要么选择覆盖,要么创建一个新的数据库。创建新的数据库是个好的实践,因为你可以通过T-SQL或Reporter.exe来做比较分析。

如果你使用SQL Nexus导入数据时遇到问题,你可以点击Open Nexus Log来查看日志文件,如图12-6所示。Rowset Importer负责导入文本文件,relog.exe负责PerfMon数据导入。SQL Nexus日志文件位于temp文件夹,你可以在Run里使用%temp%环境变量来访问。如果你导入SQL Trace文件时遇到问题,那么点击Open ReadTrace Log选项,它位于%temp%/RML文件夹。这个日志文件不仅有利于解决导入问题,还能在手动导入不同trace文件时帮你确定传入ReadTrace可执行文件的参数。

 使用SQL Nexus整合----熟悉SQL Nexus

分析整合的数据

既然成功把诊断数据装载到SQL Nexus数据库,那么这里将介绍如何利用SQL Nexus自带的报表集。在SQL Nexus欢迎界面的左侧,你可以选择想要查看的报表。如果报表没有包含必要的数据集,那么会弹出如图12-7所示的提示。

使用SQL Nexus整合----熟悉SQL Nexus

有3个可用的报表集,SQL Server 2000/2005/2008 Perf Stats。SQL Server 2008 Perf Stats报表可用于SQL Server 2008实例及更高版本实例的诊断数据。一旦这个报表涮洗成功,就会显示如图12-8所示的可用报表集:

使用SQL Nexus整合----熟悉SQL Nexus

注意,如果你使用sp_blocker_pss08捕捉阻塞信息,那么你需要用SQL Server 2000 Perf Stats报表来查看阻塞报告。可以从CodePlex网站下载SQL Server Perf Stats脚本,也可以从SQL Server 2012实例上收集阻塞和等待统计信息。下面先来看看SQL Server 2008 Perf Stats Reports自带的non-Profiler跟踪整合报告。Bottleneck Analysis报告提供3种输入集:

  • SQL 进程 vs 系统CPU使用,包括其它来自DMV sys.dm_os_ring_buffers的进程;
  • 基于SQL 2005/2008 Perf Stats脚本抓取的不同等待的瓶颈分析图表;
  • 以类别汇总不同等待的表,及数据采集期间所观测到的每种等待类别的聚合比重

如图12-9所示,瓶颈分析报表的前两节表明CPU使用率不高,然而在数据采集期间发现了锁-阻塞问题。瞟一眼报表,你可以推断出过多的之前没有调查到的系统信息。这就是为何SQL Nexus广泛应用于SQL Server专业人员:它快速洞察收集到的诊断数据。当然,你仍然需要从报告中勾画出自己的相关分析,这个工具仅仅扮演着提供用于分析的相关输入的媒介。

使用SQL Nexus整合----熟悉SQL Nexus

报告中第二块信息是图形查询,它给你观察到了不同等待的聚合视图,分组到类别。图12-10中,注意41%的等待贡献给了锁。因此,基于单份报告,你可以确定SQL Server实例有阻塞瓶颈。下一步便是向下钻取数据,以弄清阻塞瓶颈更细的细节。

使用SQL Nexus整合----熟悉SQL Nexus

现在把焦点转向Blocking and Wait Statistics报告,这份报告显示了顶端的等待类别的快照,和阻塞链列表。图12-11显示了该报告的一个实例:

使用SQL Nexus整合----熟悉SQL Nexus

 阻塞链列表包含两个额外级别的细节,它提供更多关于某个特定时间点的head blocker及与其关联的阻塞链相关的信息(如图12-12)。Head blocker对话信息与不同的快照变量一起,显示在第一层钻取。点击运行时超链接,会进入第二层钻取,该层将显示在那个时间点的不同对话的状态。

使用SQL Nexus整合----熟悉SQL Nexus

第二层钻取显示随同阻塞对话一起的所有活动的请求的快照及它们的等待时间(如图12-13)。你可以点击任何Session ID超链接来获取特定session的额外信息,和该session的输入缓存区一起。

使用SQL Nexus整合----熟悉SQL Nexus

Blocking和Wait Statistics报告有助于你先下钻取数据采集期间观察到的阻塞链。即使你没有收集SQL Trace文件,SQL Server 2005/2008 Perf Stats脚本也会捕获足够的细节,来告诉你谁阻塞什么及原因。使用3Ws,你可以更好地精确定位head blocker。

 刚刚谈到的两个报告,提供了最常见的阻塞及瓶颈场景相关的信息,而不必对导入到SQL Nexus数据库的聚合数据写一个T-SQL查询。还有一些其他的报告,可以让你能够洞察数据分析。第二个报告是Query Hash报告,它使用query_hash值来追踪类似的查询。数据由SQL Server 2008 Perf Stats Snapshot脚本收集,该脚本在SQLDIAG采集开始及结束时运行。这份报告洞察 TOP CPU、Duration及Logical Reads。这些信息是从DMV sys.dm_exec_query_stats检索来的,该DMV存放缓存的查询计划的整合性能统计。要记住这一要点,因为有问题的查询不会出现在这张报告中,如果查询计划没有被缓存或被移除缓存。

Spinlock Stats报告整合所有SQL Perf Stats脚本在数据采集期间的top spins/collision,并提供top category的图形化视图。这张报告可通过点击SQL Server 2005/2008 Perf Stats报告(图12-8)获得。这张报告用得不太广泛,但在诊断niche性能问题时非常有用,niche性能问题在前面提到的报告中不明显。Spinlock是一种轻量型的锁机制,非常短时间地锁定资源。在锁请求不成功时,不会屈服去处理器,而是循环并定期检查看是否有可用的访问。

 熟悉RML Utilities Reports

看过非Profiler相关数据的报告后,这里看看SQL Trace数据相关的报告。SQL Trace数据由ReadTrace可执行程式导入到SQL Nexus数据库。当RML Utilities安装ReadTrace_Main报告报表头下时,SQL Nexus里有一套可用的报告。如果安装RML Utilities之后不能看到ReadTrace_Main报告时,可参考后面“解决常见问题”中讲到的Issue #1。

 ReadTrace_Main报告提供里不同batch的整合视图,线图显示了所有batch的Duration、CPU使用、读取及写入的变化,如图12-14所示。

使用SQL Nexus整合----熟悉SQL Nexus

该报告的下半部分如图12-15所示,它提供了一张表及所有从SQL Trace文件导入的数据的整合概要。列Interval Start可以钻取显示那个时间区间的TOP N查询,其汇总CPU使用、Duration、写入及读取。如果你使用ReadTrace_Main报告顶部的Unique Batch或Unique Statement超链接,你可以查看整个数据采集期间最耗资源的查询列表。如果你钻取查看每个查询的细节,你会发现两个选项,也就是按batch和statement向下钻取。

使用SQL Nexus整合----熟悉SQL Nexus

你还可以对报告使用过滤,选择应用程序名或数据库ID或登录名。你还可以使用Parameter栏来改变开始和结束时间。

Interesting Events报告,如图12-16所示,它识别数据采集期间发生的不同事件,这有助于你解决问题。该报告以类型、运行时间隔对不同事件进行分组,以便做分析。例如查询取消、排序警告、哈希警告及异常。Parameter栏可以让你缩短时间窗。

使用SQL Nexus整合----熟悉SQL Nexus

当你查看显示unique batch或unique statement信息的报告时,你可以通过点击batch或查询来钻取。这能让你看到在某个时间间隔中每个执行的CPU使用、Duration、读和写。你也可以使用钻取选项查看batch或statement的查询计划及查询文本。

截至目标,所有讨论的报告都可以使用SQL Nexus UI的Export选项以图12-17所示的格式导出。

使用SQL Nexus整合----熟悉SQL Nexus

如果你使用Export选项,Access Control Lists(ACLs)会应用到报告,以阻止未授权的访问。导出报告的用户仅仅是有完全访问权限的人。Reporter的用户对数据的传播负最终责任。

Reporter.exe生成的对比分析报告

要查看前述的报告,你也可以使用Reporter可执行程序,它位于C:\Program Files\Microsoft Corporation\RMLUtils文件夹中,双击可以启动Reporter.exe。Reporter能够帮你做比较分析。如果你在不同时间对同一个SQL Server实例收集到两套诊断数据,那么你就可以把SQL Trace数据导入到来那个独立的数据库,并使用Reporter执行自动比对分析。一旦分析完成,就会显示如图12-18所示的对比图。在Comparison Overview报告的底部细节表显示了查询的汇总概要的对比。RML Utilities Help文件对报告及使用有详细的说明。

使用SQL Nexus整合----熟悉SQL Nexus