SQL执行计划解析(1)- 执行计划基础(下)

Getting Started

如果你不是sysadmin、dbcreator、db_owner,那么你需要权限查看执行计划

GRANT SHOWPLAN TO [username]

第一个例子非常简单,打开management studio,键入以下查询

SELECT *
FROM [dbo].[DatabaseLog];

点击动作条上Display estimated Execution Plan按钮,就看到了我们的第一个预估执行计划

图1-1

我们稍后再加以解释,现在我们再抓一个实际的执行计划,和预估的执行计划不同,实际的执行计划并不代表优化器的计算结果,而是代表了查询执行时实际发生的事情,通常两者是一样的,但是有时也不一样,这取决于存储引擎对执行计划的修改。点击Include Actual Execution Plan按钮使之处于激活状态,点击Execute。

我们这个例子里预估的执行计划和实际的执行计划是一致的。 左边的SELECT图标你将来会看到很多,通常可以忽略掉,它表示来自关系引擎的最终结果和格式(formatting)。
右边的Table Scan图标是第一个也是最容易查找的图标。 通常我们会从右到坐、从上到下地读一个图形执行计划。图标之间的意思是代表运算符(operator)之间的数据传递。
这个例子里边,我们只有一个Table Scan运算符产生了结果集。箭头的宽度代表了数据量的大小,箭头越宽意味这更多行的数据。这种可视的方式可能会给你错误的印象,你可以将鼠标悬停于箭头之上来查看它所代表的数据的具体行数。 每个图标下边都有个百分数,代表了该运算符相对于整个查询的开销,注意,这是个比率不是实际的数字,即使是0%也会有微小的开销。图标上边有个百分数表示查询在批量查询中的开销百分比,可以使用批量查询执行多个查询并获取执行计划。

ToolTips

每个图标和箭头都有一个与之关联的弹出窗口即ToolTips,鼠标悬停于其上就可以看到。预估执行计划中鼠标悬停于SELECT图标之上就会看到下图1-3.

如图,优化器产生了以下几个数字

  1. Cached plan size --  查询产生的执行计划将会占用stored procedure cache的多少内存,当你调查cache性能的时候这是个很有用的数字,用它能够查看哪些执行计划占用了更多的内存。
  2. Estimated Operator Cost --我们在图1-1中已经看到了这个开销百分比。
  3. Estimated Subtree Cost -- 它代表了前面的步骤到此步骤累计的开销,记得从右到坐读。这个数字对真实世界没有意义,它只是查询优化器用来决定运算符开销的算术评估值,它代表了优化器认为的运算符需要花费多少时间。
  4. Estimated Number of Rows -- 基于统计数据计算而出
  5. 上述信息下边还有sql声明

Table Scan的ToolTips如下图1-4

图1-4

Logical Operation 代表了优化器的计算结果,即优化器认为的查询执行时应该发生什么操作,而Physical Operation代表了实际发生了什么操作,一般来说两者是一致的,但也有例外,第二章有更多讨论.
然后是I/O、CPU、Operator、Subtree的预估开销,Subtree就是执行树中到当前为止的部分。所有的预估都是基于列和索引的统计数据。I/O Cost 和CPU cost不是实际的运算符,而是查询优化器在计算中分配的开销数字。这些数字有助于确定开销是I/o密集型还是cpu密集型。你可能注意到Operator Cost 和Subtree Cost是一样的,这是因为Table Scan是我们唯一的运算符。Ordered布尔值表示数据是否处于排序状态。NodeID 节点序数,顺序是从左到右的,尽管阅读的最好方式是从右到坐。

运算符属性

右键点击图标,选properties,可以看到更多信息,多数我们已经遇到了,不过还有些新的。

图1-5

Defined Values显示了该操作向过程追加的信息,这些信息可能是基本查询的一部分,我们这个例子里是被选中的列,也可能是查询过程中内部创建的值,比方说一些确定内部引用完整性的标记,也可能是聚合函数计数的占位符。Estimated Rebinds和Rewinds这两个值是执行计划里init()被调用的次数。Foreced Index,使用query hint强制使用某个索引的时候为True。Sql Server通过query hint提供了一些功能,使用户可以对如何执行查询进行某些控制。NoExpandHint 此项的概念和Forced Index基本相同,只不过是用于索引视图。

文本执行计划和Xml执行计划

要想获取文本执行计划,在查询开始加上一个命令就可以了

SET SHOWPLAN_ALL ON;

关闭文本计划,使用

SET SHOWPLAN_ALL OFF;

获取实际的文本计划,使用

SET STATISTICS PROFILE ON

SET STATISTICS PROFILE OFF

获取实际的和预估的xml执行计划,使用

SET SHOWPLAN_XML ON

SET SHOWPLAN_XML OFF

ps:关于文本和Xml执行计划的更多细节就略过了

使用Sql Server Profiler自动捕获执行计划

在开发阶段,我们可以通过上述几种方式来捕获执行计划。但是在测试服务器或者运行中的服务器,可能并不允许我们这样做,Sql Server2005中可以使用Profiler在运行查询的同时捕获Xml执行计划。
Profiler是一个强大的工具,使用户可以捕获关于事件的数据。Profiler的事件可以通过GUI界面进行手动跟踪,也可以自己定义跟踪,并在特定的时间自动运行。这些跟踪信息可以通过屏幕查看,也可以发送到文件或数据库的表中。

执行计划事件

  • Showplan Text : 此事件在每次查询时均触发,生成的计划类型和Showplan_Text声明相同,是Showplan Xml生成的内容的子集。
  • Showplan Text (unencoded) : 同上,不过此事件是以字符串形式展示信息而不是二进制方式。
  • Showplan All : 此事件在每次查询时均触发,生成的计划类型和Showplan_all声明相同.
  • Showplan All for Query Compile : 此事件生成的数据和Showplan All相同,不过此事件仅在查询编译时触发。
  • Showplan Statistics Profile:此事件生成实际的执行计划,方式和T-Sql命令Statistics Profile相同。它生成的信息是Statistics Xml命令或Showplan Xml Statistics Profile事件的子集。
  • Showplan Xml:此事件在每次查询时均触发,产生一个预估的执行计划,同Showplan_Xml.
  • Showplan Xml for Query Compile: 同上,仅在查询编译时触发。
  • Performance Statistics:和Showplan Xml for Query Compile 类似,此事件不仅捕获执行计划也捕获性能测量数据。此事件仅捕获其中定义的子事件类的Xml输出。此事件在第一次进入Cache时、编译时、重编译时以及从Cache里移除时触发。
  • Showplan Xml Statistics Profile:此事件在每个查询运行时产生其实际的执行计划。

使用Showplan xml或者Showplan Xml Statistics Profile捕获所有的执行计划毫无疑问会增加服务器的负担,这些都不是轻量级的事件。即使使用不常用的Showplan Xml for Query compile也会导致小的性能下降。谨慎使用。

捕获Showplan Xml跟踪

启动Profiler -> 新建一个跟踪并连接到服务器 –> 切换至Events Selection标签页 –> 勾选Show all events复选框 –> 点击+号展开Performance部 –> 勾选Showplan xml事件

现在就可以在Profiler里捕获Showplan xml事件了,通常同时捕获一些其他的基本事件会有用处,如:RPC:Completed, SQL:BatchStarting,SQL:BatchCompleted等。

1-6

图1-6

当勾选了Showplan Xml事件之后,第三个标签页就出现了,在那里可以指定将输出的Xml发送往独立的文件。

点击Run启动跟踪,当有查询执行时就可以获得类似下图的结果

1-7

图1-7

TextData列里就是实际的Xml执行计划。选中的时候下边的窗口就出现了图形执行计划。你可以右键点击然后选择Extract Event data来将计划存到另外的文件里。

posted on 2011-09-06 09:46  chouyuu  阅读(3587)  评论(1编辑  收藏  举报