SQL Server优化之SET STATISTICS开关(转载)
一、准备工作
缓存对于某个查询的性能影响十分之大,所以优化之前要清空缓存。
清除Buffer Pool里面的所有缓存
DBCC DROPCLEANBUFFERS
清除Buffer Pool里的所有缓存的执行计划,已经预编译的内容,在此处将被清空
DBCC FREEPROCCACHE
二、SET STATISTICS TIME ON/OFF开关
这个开关能输出SQL语句各阶段所消耗的时间
返回值说明:
CPU Time,SQL Server所花的纯CPU时间是多少,也就是说语句花了多少CPU资源
elapsed Time,语句运行的时间长短,有些动作会发生I/O操作、产生了I/O等待,或者是遇到阻塞、产生阻塞的等待,总之时间用掉了,但是没有用CPU资源,所以Elapsed Time比CPU Time长是很正常的。但是CPU Time是语句在所有CPU上的时间总和,如果语句使用了多颗CPU,而其他等待几乎没有,那么CPU Time大于Elapsed Time也是正常的。
SQL Server parse and compile time,语句的编译时间
SQL Server Execution Times,语句真正运行的时间
效果如下:
三、SET STATISTICS IO ON/OFF开关
这个开关能够输出语句做的物理读和逻辑读的数,这个开关对SQL Server执行计划的性能调优非常重要。一般逻辑读次数(logical reads)越小越好。
返回值说明:
scan count:执行的扫描次数。按照执行计划,表格被Scan了几次。一般来讲大表Scan的次数越多越不好,唯一的例外是如果执行计划选择了并发运行,由多个Thread同时做一个表的读取,每个Thread读其中的一部分,但是这里会显示所有Thread的数目。也就是有几个Thread在并发做,就会有几个Scan。这时数目大一点没问题。
logical reads:从数据缓存读取的页数。页数越多,说明查询要访问的数据量就越大,内存消耗量越大,查询也就越昂贵。可以检查是否应该调整索引,减少扫描的次数,缩小扫描范围。
physical reads:从磁盘读取的页数。
read-ahead reads:为进行查询而预读入缓存的页数。
physical reads + read ahead reads就是SQL Server为了完成这句查询而从磁盘上读取的页数。如果不为0,说明数据没有缓存在内存里,运行速度一定会受到影响。
lob logical reads:从数据缓存读取的Text、Ntext、Image或大值类型(Varchar(max)、Nvarchar(max)、Varbinary(max))页的数目。
lob physical reads:从磁盘读取的Text、Ntext、Image或大值类型页的数目。
lob read-ahead reads:为进行查询而放入缓存的Text、Ntext、Image或大值类型页的数目。
效果如下:
四、SET STATISTICS PROFILE ON/OFF开关
这个开关能返回语句的执行计划,以及语句运行在每一步的实际返回行数
Rows:执行计划的每一步返回的实际行数。
Executes:执行计划的每一步被运行了多少次。
StmtText:执行计划的具体内容。执行计划以一棵树的形式显示。每一行,都是运行的一步,都会有结果集返回,也都会有自己的cost。
EstimateRows:SQL Server根据表格上的统计信息,预估的每一步的返回行数。在分析执行计划时,我们会经常将Rows和EstimateRows这两列做对比,先确认SQL Server预估得是否准确。
EstimateIO:SQL Server根据EstimateRows和统计信息里记录的字段长度,预估的每一步会产生的I/O cost。
EstimateCPU:SQL Server根据EstimateRows和统计信息里记录的字段长度,以及要做的事情的复杂度,预估的每一步会产生的CPU cost。
TotalSubtreeCost:SQL Server根据EstimateIO和EstimateCPU通过某种计算公式,计算出的每一步执行计划子树cost(包括这一步自己的cost和它的所有下层步骤的cost总和)。
Warnings:SQL Server在运行每一步时遇到的警告,例如,某一步没有统计信息支持cost预估等。
Parallel:执行计划的这一步是不是使用了并行的执行计划。
效果如下: