技术开发 频道

SQL语句性能调试与分析之执行计划

  在这个提示框中有下面的一些度量信息:

  操作符的名字和简单的介绍

  物理运算:计算机内部的物理运算

  逻辑运算:与物理运算符匹配的逻辑运算符,如 Inner Join 运算符。逻辑运算符列在物理运算符之后,两者均位于工具提示的顶部。

  返回的行数: 运算返回的数据行数

  估计I/O开销,估计CPU开销: 这个数据可以用来估算这个操作是不是造成很大的CPU或者I/O开销,一般Sort操作都会造成很大的I/O开销

  估计执行行数和执行行数:估计该操作执行的次数和实际执行的次数。这个数据可以帮助你找到更好的执行语句

  估计执行开销:用于执行此操作的查询优化器的开销

  估计子树开销:查询优化器执行此操作及同一子树内位于此操作之前的所有操作的总开销

  运算生成的行数:估计运算符生成的行数。有些情况下可以通过实际行数和估计行数之间的差异来判断一个SQL语句的优劣

  估计数据大小:操作符生成的行的估计大小(字节)。可能你会疑惑为什么这个实际行数没有显示在执行计划里面,那是因为数据行里面有可变长度的数据类型

  实际的重绑和重绕: 这个数据之和一些特定的操作有关(非聚集的缠绕,远程请求,行数缠绕,排序,表缠绕,表值函数,断言,过滤等)。只有在内层嵌套查询的时候这才会统计个度量信息,否则Rebinds是1,Rewinds是0。这些数据表示内层的Init方法被调用。重绑和重绕的综合应该是外连接得到的行数之和。重绑意味着一个或者多个相关的连接参数改变了,需要重新估算。重绕意思是相关的参数没有改变,可以重用先前得到的内部结果集

  底部的信息:显示相关的对象名,输出,参数等等

  选中一个操作符,按下F4键,可以查看更加详细的信息。

  文本格式的执行计划

  可以通过设置以文本格式查看执行计划。设置SHOWPLAN_TEXT选项可以达到这个目的,如下:

    SET SHOWPLAN_TEXT ON;SELECT orderid, custid, empid, shipperid, orderdate, 
    fillerFROM dbo.Orders WHERE orderid = 280885;

  查看执行计划(CTRL+L)得到下面的结果:

    (1 row(s) affected)StmtText
       SELECT orderid, custid, empid, shipperid, orderdate, fillerFROM 
       dbo.Orders WHERE orderid = 280885;
    (1 row(s) affected)StmtText
       Nested Loops(Inner Join, OUTER REFERENCES:
       ([Uniq1002], [Performance].[dbo].[Orders].[orderdate])) 
       |--Index Seek(OBJECT:([Performance].[dbo].[Orders].[PK_Orders]),
       SEEK:([Performance].[dbo].[Orders].[orderid]=[@1]) ORDERED FORWARD)
       |--Clustered Index Seek(OBJECT:
       ([Performance].[dbo].[Orders].[idx_cl_od]), 
       SEEK:([Performance].[dbo].[Orders].[orderdate]=
       [Performance].[dbo].[Orders].[orderdate] AND 
       [Uniq1002]=[Uniq1002]) LOOKUP ORDERED FORWARD)
     (3 row(s) affected)
     (1 row(s) affected)

  分析这个执行计划,从内层的分支到外层分支,从上到下。但是在这里我们只能看到运算符的名字和参数。运行下面的语句关闭这个选项:SET SHOWPLAN_TEXT OFF;如果想得到更加详细的执行计划信息,使用SHOWPLAN_ALL选项查看执行计划,STATISTICS PROFILE选项查看具体的某一个执行计划。SHOWPLAN_ALL将执行计划的信息写入到一个表中,其中包含的一些估计的值有:StmtText, StmtId, NodeId, Parent, PhysicalOp, LogicalOp, Argument, Defi nedValues,EstimateRows, EstimateIO, EstimateCPU, AvgRowSize, TotalSubtreeCost, OutputList,Warnings, Type, Parallel, and EstimateExecutions。通过下面的语句打开这个选项:SET SHOWPLAN_ALL ON;运行下面的语句:

    SELECT orderid, custid, empid, shipperid, 
    orderdate, fillerFROM dbo.Orders WHERE orderid = 280885;

    得到的结果如下图5:

  运行下面的语句关闭选项:SET SHOWPLAN_ALL OFF;STATISTICS PROFILE选项会产生一个实际的计划。设置这个选项为ON的时候显示的结果和设置SHOWPLAN_ALL为ON差不多,不过多了两个属性Rosw和Executes,表示实际的行数和运行行数。

  语句如下:

    SET STATISTICS PROFILE ON;
    SELECT orderid, custid, empid, shipperid, orderdate, filler FROM 
    dbo.Orders WHERE orderid = 280885;

  取消设置:

    SET STATISTICS PROFILE OFF;

  XML格式的执行计划

  如果想用自己的代码来描述执行计划或者把执行计划发送给客户或者同事,你会发现使用文本格式的信息很不方便。SQL Server 2008允许允许返回XML格式的执行计划内容,这非常利于使用应用程序代码处理。打开使用SQL Server 2008产生的xml格式的执行计划会显示成图形结果,后缀是.sqlplan。

  打开这个选项的代码如下:

  SET SHOWPLAN_XML ON;

  运行语句  

   SELECT orderid, custid, empid, shipperid, orderdate, filler FROM 
   dbo.Orders WHERE orderid = 280885;

  运行结果如下图6:

  点击这个xml文件,图形格式的执行计划如下图7:

  使用下面的语句关闭选项:

    SET SHOWPLAN_XML OFF;

  为了不影响其他语句的输出效果建议使用类似下面的代码来查看效果:

    SET STATISTICS XML ON;GOSELECT orderid, custid, empid, shipperid, orderdate,
    
    filler FROM dbo.Orders WHERE orderid = 280885;GOSET STATISTICS XML OFF;

  可以看出XML格式的执行计划提供了最友好的查看形式。

  更多精彩尽在2014年4月10日-12日在北京五洲皇冠国际酒店举办的第五届中国数据库技术大会,2月29日之前订票可享受7.8折最低票价。

Facebook专家:Hadoop不足以处理大数据
进入官网了解更多详情

0
相关文章