测试和比较SQL Server查询性能


前阵子我跟一个开发商,谁也打不随意的DBA在公司中的作用。



当我们谈论自己的服务器中的一个表现不佳,我意识到事情并没有增加,所以我决定问生硬的问题:



“你如何衡量你写的查询的性能?你用什么工具?“



他看着我,说:“ 。好吧,以后我写我打开任务管理器的查询,我执行查询,我看看,如果有CPU中的秒杀 “

然后我意识到,这是必不可少的未来福祉的系统(和公司),我们向后退了一步,了解业界性能调试的工具。



此开发商没有介意,而且我必须说,这花了大约30分钟,他高兴地性能测试他的疑问。

最近我写了一个帖子性能调优轮,其中提到的许多性能调整工具,但在这个博客中,我将集中讨论pformance收集了几个非常重要的方法,比较和标杆。

为什么任务管理器还不够吗?

让我们开始在根:一个查询可以以多种方式影响SQL Server的硬件。它可以影响CPU,内存,磁盘系统中,上述的组合;查询可以影响其它的查询,从而其可以影响硬件。

所有的这也是由体积,规模,图案等测定。

由于它具有所有上述的信息非常少。



好吧,还有什么?

开始寻找一个查询性能的一个好方法是看在IO和CPU状态在SSMS中。



设置查询选项



......或者只是写这样的查询:



查看代码的TSQL




使用的AdventureWorks;
GO
SET  STATISTICS IO   ON 
SET  STATISTICS  TIME   ON
 
选择第名,公关。ProductReviewID 
从生产。产品 p
 加入生产。ProductReview公关
 上页的ProductID  = PR。产品编号
 
SET  STATISTICS IO   OFF 
SET  STATISTICS  TIME   OFF



这个语句将执行,也将返回信息是这样的:

(4行(S)受影响)
表'产品'。扫描计数1,逻辑读取8,物理读0次,预读0,lob逻辑读取0次,lob物理读取0次,lob预读0。
表'ProductReview“。扫描计数1,逻辑读取4,物理读0次,预读0,lob逻辑读取0次,lob物理读取0次,lob预读0。

SQL Server执行时间:
CPU时间= 0毫秒,占用时间= 15毫秒。

SQL Server执行时间:
CPU时间= 0毫秒,占用时间= 0毫秒。

 

另一种方式来看待这个查询是使用客户端的统计信息。

 



使用客户端的统计数据来衡量和比较查询



 

另一种更全面的方式来看待一个查询是看事件探查器 - 它提供了有关查询和有关并发事件的信息。

 

为了得到一个甚至更好的画面,我们可以捕捉Perfmon计数器和事件探查器跟踪和关联他们。这种方法显示的查询,并发性和系统信息。

 



执行计划 - 是的,它确实给性能信息,但这是更多的关于查询的执行,不是一个完整的画面时所发生的事情的'临时'的信息。执行计划是不是稳定的,当查询优化器(QO)产生的计划,它认为整个一系列因素的感觉,因此对于一个查询的执行计划的执行可能会有所不同(例如,看一下并行的情况下 - 有可以保存为一个查询两个不同的计划 - 1采用并行,而其他没有使用它)

此外,该执行计划包含相对值,即运营商的成本是相对于他们的休息。这给出了一个很好的机会,在比较同一批次执行的查询,看看是否有在执行计划还是什么的总成本有差异。

最后,执行计划并没有给什么(这可能看上去很可笑)是执行计划本身的发电成本。这是事实,QO的本质是产生“足够好”的计划是比查询本身的执行成本较低,但在同一时间的问题可能是因为高数生成的计划的而已。请记住,这在生成查询规划是一个相当昂贵的操作。

 



查询执行计划



另一种方式来看待查询性能的动态管理视图。

DMV统计给有关执行,但他们也有糟糕的时间安置。我的意思的时候糟糕的位置是动态管理视图是累积的斑点,即使他们给一些特定事件或查询信息,有没有什么好办法来获得有关其他相关的事件发生在同一时间的信息(除非你真的在管理权第二次执行正确的DMV!)。

嗯,你可以编写自己的工具来收集多一点的详细信息和事件关联,但这是过时的,因为扩展的事件慢慢来RPLACE的动态管理视图和其它性能调试工具。

 

底线是:知道您要使用哪些工具,以及他们所擅长的,什么信息,他们不给。