set statistics profile on的用法

本文导读:该语句执行后,除了返回常规结果集外,还返回每个语句的执行信息。SET STATISTICS PROFILE ON 输出还包含有关各种操作符处理的实际行数和操作符的实际执行数。下面介绍set statistics profile on的用法

一、SET STATISTICS PROFILE ON的用处

返回语句的执行计划,以及语句运行在每一步的实际返回行数统计。通过这个结果,不仅可以得到执行计划,理解语句执行过程,分析语句调优方向,也可以判断SQLSERVER是否选择了一个正确的执行计划。通过这样的方法,用户可以了解到语句的执行计划、SQLSERVER预估的准确性、cost的分布

 

二、统计返回的字段说明

 

Rows

执行计划的每一步返回的实际行数

 

Executes

执行计划的每一步被运行了多少次

 

StmtText

执行计划的具体内容。执行计划以一棵树的形式显示。每一行都是运行的一步,都会有结果集返回,也都会有自己的cost

 

EstimateRows

SQLSERVER根据表格上的统计信息,预估的每一步的返回行数。在分析执行计划时,我们会经常将Rows和EstimateRows这两列做对比,先确认SQLSERVER预估得是否正确,以判断统计信息是否有更新

 

EstimateIO

SQLSERVER根据EstimateRows和统计信息里记录的字段长度,预估的每一步会产生的I/O cost

 

EstimateCPU

SQLSERVR根据EstimateRows和统计信息里记录的字段长度,以及要做的事情的复杂度,预估每一步会产生的CPU cost

 

TotalSubtreeCost

SQLSERVER根据EstimateIO和EstimateCPU通过某种计算公式,计算出每一步执行计划子树的cost(包括这一步自己的cost和他的所有下层步骤的cost总和)

 

Warnings

SQLSERVER在运行每一步时遇到的警告,例如,某一步没有统计信息支持cost预估等。

 

Parallel

执行计划的这一步是不是使用了并行的执行计划

 

 

三、set statistics profile on实例

 

1、SQL语句实例

 
SQL 代码    复制

  SET STATISTICS PROFILE ON
GO
SELECT COUNT(b.[SalesOrderID])
FROM [dbo].[SalesOrderHeader_test] a
INNER JOIN [dbo].[SalesOrderDetail_test] b
ON a.[SalesOrderID]=b.[SalesOrderID]
WHERE a.[SalesOrderID]>43659 AND a.[SalesOrderID]<53660
GO

 

2、返回的结果集中重要字段

 

 

 

3、备注

注意:这里是从最下面开始向上看的,也就是说从最下面开始一直执行直到得到结果集所以(行1)里的rows字段显示的值就是这个查询返回的结果集。

而且有多少行表明SQLSERVER执行了多少个步骤,这里有6行,表明SQLSRVER执行了6个步骤!!

  

4、分析

 

上面的执行计划可以分为以下几步

 

1、(第5行):从[SalesOrderHeader_test]表里找出所有a.[SalesOrderID]>43659 AND a.[SalesOrderID]<53660的值

因为表在这个字段上有一个聚集索引,所以SQL可以直接使用这个索引的seek

SQL预测返回10000条记录,实际也就返回了10000条记录.。这个预测是准确的。这一步的cost是0.202(totalsubtreecost)

 

2、(第6行):从[SalesOrderDetail_test]表里找出所有 a.[SalesOrderID]>43659 AND a.[SalesOrderID]<53660的值

因为表在这个字段上有一个非聚集索引,所以SQL可以直接使用这个索引的seek

虽然查询语句只定义了[SalesOrderHeader_test]表上有a.[SalesOrderID]>43659 AND a.[SalesOrderID]<53660过滤条件,但是根据语义分析,SQL知道这个条件在[SalesOrderDetail_test]上也为真。所以SQL选择先把这个条件过滤然后再做join。这样能够大大降低join的cost

在这一步SQL预估返回50561条记录,实际返回50577条。cost是0.127,也不高

 

3、(第4行):将a1和a2两步得到的结果集做一个join。因为SQL通过预估知道这两个结果集比较大,所以他直接选择了Hash Match的join方法。

SQL预估这个join能返回50313行,实际返回50577行。因为SQL在两张表的[SalesOrderID]上都有统计信息,所以这里的预估非常准确

这一步的cost等于totalsubtreecost减去他的子步骤,0.715-0.202-0.127=0.386。由于预估值非常准确,可以相信这里的cost就是实际每一步的cost

 

4、(第3行):在join返回的结果集基础上算count(*)的值这一步比较简单,count(*)的结果总是1,所以预测值是正确的。

其实这一步的cost是根据上一步(b)join返回的结果集大小预估出来的。我们知道步骤b的预估返回值非常准确,所以这一步的预估cost也不会有什么大问题

这棵子树的cost是0.745,减去他的子节点cost,他自己的cost是0.745-0.715=0.03。是花费很小的一步

 

5、(第2行):将步骤c返回的值转换为int类型,作为结果返回



set statistics profile on 
select orderno from dbo.tblorders where orderno='20151109010022619829'
select orderno from dbo.tblorders where orderno=N'20151109010022619829'


http://blogs.msdn.com/b/apgcdsd/archive/2012/04/20/sql-server-2008.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值