纵有疾风起
人生不言弃

《T-SQL查询》读书笔记Part 2.执行计划

一、关于执行计划

执行计划是优化器生成的用于确定如何处理一个给定查询的“工作计划”。一个计划包含一组运算符,通常按照特定的顺序来应用这些运算符。此外,一些运算符可以在它们之前的运算符还在处理时被应用(即不一定是完全串行),还有一些运算符也有可能被应用多次。

二、图形化执行计划

2.1 SSMS中的图形化执行计划

  在SSMS(SQL Server Management Studio)中,有两种图形化的执行计划可供选择。一种是估计执行计划(Ctrl+L键),另一种是实际执行计划(Ctrl+M键)。两种计划通常都是一样的,只是执行时间点不同。估计查询计划是在查询执行之前生成,而实际执行计划则是在查询输出的同时得到的。

2.2 图形化执行计划实例

  Step1.示例查询

  (1)假设我们有一张Orders表,里面有100w行订单数据,从2005年开始到2009年。

  《T-SQL查询》读书笔记Part 2.执行计划插图

  (2)待分析的查询语句

-- 图形化执行计划查询示例SELECT custid, empid, shipperid, COUNT(*) AS numordersFROM dbo.OrdersWHERE orderdate >= '20080201'  AND orderdate < '20080301'GROUP BY CUBE(custid, empid, shipperid);GO

  Step2.估计的执行计划查看(选中SQL语句按Ctrl+L)

  《T-SQL查询》读书笔记Part 2.执行计划插图1

  当我们将光标移动到某个运算符上面时,可以得到该运算符返回的估计行数和开销。箭头的粗细与源运算符返回的行数是成正比的。所以,重点关注比较粗的箭头,它们可能预示着性能问题。

  《T-SQL查询》读书笔记Part 2.执行计划插图2

  Step3.实际的执行计划(先选中“包括实际的执行计划”,再执行该查询,即可同时得到查询的输出和实际的计划)

  《T-SQL查询》读书笔记Part 2.执行计划插图3

  《T-SQL查询》读书笔记Part 2.执行计划插图4  

  这时再把光标移到某个运算符,看到的会变为“实际行数”。

  《T-SQL查询》读书笔记Part 2.执行计划插图5

  Step4.缩放到合适的大小=>如果得到了一个无法适合屏幕显示的计划时,可以使用一个很酷的功能,叫做缩放到合适大小。(点击鼠标右键出现菜单,选择即可)

  《T-SQL查询》读书笔记Part 2.执行计划插图6

  点击后,执行计划会变为如下图所示:

  《T-SQL查询》读书笔记Part 2.执行计划插图7

  Step5.执行计划是由运算符组成的一个树状结构,在图形化计划中,是从右到左从上到下的顺序来表示的。在这个例子中,聚集索引查找(Clustered Index Seek)是数据流的第一个运算符,生成的输出传到树中的下一个运算符-表假脱机(Eager Spool),以此类推。

  《T-SQL查询》读书笔记Part 2.执行计划插图8

  我们需要注意与每个运算符相关联的开销百分比,这个值是某个运算符的开销占查询全部开销的百分比,由优化器估算。这里,我们需要多留意一下百分比值比较高的运算符,重点对这些运算符进行优化

  《T-SQL查询》读书笔记Part 2.执行计划插图9

  此外,当我们将光标放在一个运算符上面时,其中有一项叫做“估计子树大小(Estimated Subtree Cost)”,这个值代表从当前运算符开始的子树的累计估计大小。比如,这里我们通过将光标移动到最左边的SELECT运算符,即根节点,可以看到整个查询的估计开销(因为其子树代表了整个查询)。

  《T-SQL查询》读书笔记Part 2.执行计划插图10

2.3 比较多个查询的开销

  图形化执行计划的另一个有用的功能就是可以方便地比较多个查询的开销。

  假设我们想比较以下几个实现类似目标的查询的开销:

SELECT custid, orderid, orderdate, empid, fillerFROM dbo.Orders AS O1WHERE orderid =  (SELECT TOP (1) O2.orderid   FROM dbo.Orders AS O2   WHERE O2.custid = O1.custid   ORDER BY O2.orderdate DESC, O2.orderid DESC);SELECT custid, orderid, orderdate, empid, fillerFROM dbo.OrdersWHERE orderid IN(  SELECT    (SELECT TOP (1) O.orderid     FROM dbo.Orders AS O     WHERE O.custid = C.custid     ORDER BY O.orderdate DESC, O.orderid DESC) AS oid  FROM dbo.Customers AS C);SELECT A.*FROM dbo.Customers AS C  CROSS APPLY    (SELECT TOP (1)        O.custid, O.orderid, O.orderdate, O.empid, O.filler     FROM dbo.Orders AS O     WHERE O.custid = C.custid     ORDER BY O.orderdate DESC, O.orderid DESC) AS A;WITH C AS(  SELECT custid, orderid, orderdate, empid, filler,    ROW_NUMBER() OVER(PARTITION BY custid                      ORDER BY orderdate DESC, orderid DESC) AS n  FROM dbo.Orders)SELECT custid, orderid, orderdate, empid, fillerFROM CWHERE n = 1;GO

  在SSMS中选中他们,并请求图形化执行计划(估计的或实际的)。这里,我们将会得到如下图所示的计划。

  《T-SQL查询》读书笔记Part 2.执行计划插图11

  从图中可以看到,在每个计划顶部都会有一个百分比,表示该查询的开销占整个批处理总开销的百分比,这里Query1=>34%,Query2=>19%,Query3=>28%,Query4=>20%,可以看出,Query1的查询开销最大,需要进一步检查其性能。

  关于黄色窗口的各个属性项,具体可以参考:显示图形执行计划 (SQL Server Management Studio)

参考资料

  《T-SQL查询》读书笔记Part 2.执行计划插图12

  [美] Itzik Ben-Gan 著,成保栋 译,《Microsoft SQL Server 2008技术内幕:T-SQL查询》

 

文章转载于:https://www.cnblogs.com/edisonchou/p/8035521.html

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » 《T-SQL查询》读书笔记Part 2.执行计划
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录