《T-SQL查询》读书笔记Part 2.执行计划
一、关于执行计划
执行计划是优化器生成的用于确定如何处理一个给定查询的“工作计划”。一个计划包含一组运算符,通常按照特定的顺序来应用这些运算符。此外,一些运算符可以在它们之前的运算符还在处理时被应用(即不一定是完全串行),还有一些运算符也有可能被应用多次。
二、图形化执行计划
2.1 SSMS中的图形化执行计划
在SSMS(SQL Server Management Studio)中,有两种图形化的执行计划可供选择。一种是估计执行计划(Ctrl+L键),另一种是实际执行计划(Ctrl+M键)。两种计划通常都是一样的,只是执行时间点不同。估计查询计划是在查询执行之前生成,而实际执行计划则是在查询输出的同时得到的。
2.2 图形化执行计划实例
Step1.示例查询
(1)假设我们有一张Orders表,里面有100w行订单数据,从2005年开始到2009年。

(2)待分析的查询语句
-- 图形化执行计划查询示例
SELECT custid, empid, shipperid, COUNT(*) AS numorders
FROM dbo.Orders
WHERE orderdate >= ''
AND orderdate < ''
GROUP BY CUBE(custid, empid, shipperid);
GO
Step2.估计的执行计划查看(选中SQL语句按Ctrl+L)

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

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

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

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

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

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

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

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

2.3 比较多个查询的开销
图形化执行计划的另一个有用的功能就是可以方便地比较多个查询的开销。
假设我们想比较以下几个实现类似目标的查询的开销:
SELECT custid, orderid, orderdate, empid, filler
FROM dbo.Orders AS O1
WHERE 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, filler
FROM dbo.Orders
WHERE 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, filler
FROM C
WHERE n = 1;
GO
在SSMS中选中他们,并请求图形化执行计划(估计的或实际的)。这里,我们将会得到如下图所示的计划。

从图中可以看到,在每个计划顶部都会有一个百分比,表示该查询的开销占整个批处理总开销的百分比,这里Query1=>34%,Query2=>19%,Query3=>28%,Query4=>20%,可以看出,Query1的查询开销最大,需要进一步检查其性能。
关于黄色窗口的各个属性项,具体可以参考:显示图形执行计划 (SQL Server Management Studio)
参考资料

[美] Itzik Ben-Gan 著,成保栋 译,《Microsoft SQL Server 2008技术内幕:T-SQL查询》
《T-SQL查询》读书笔记Part 2.执行计划的更多相关文章
- SQL查询(笔记2——实体查询)
SQL查询(笔记2——实体查询) 二.实体查询 如果查询返回了某个数据表的全部数据列,且该数据表有对应的持久化类映射,我们就把查询结果转换成实体查询.将查询结果转换成实体,可以使用SQLQuery提供 ...
- TIJ读书笔记02-控制执行流程
TIJ读书笔记02-控制执行流程 TIJ读书笔记02-控制执行流程 if-else 迭代 无条件分支 switch语句 所有条件语句都是以条件表达式的真假来决定执行路径,也就是通过布尔测试结果来决 ...
- 05 技术内幕 T-SQL 查询读书笔记(第四章)
第四章 子查询:在外部查询内嵌套的内部查询(按照期望值的数量分为,标量子查询 scalar subqueries,多值子查询multivalued subqueries)(按照子查询对外部查询的依赖性 ...
- 浅析SqlServer简单参数化模式下对sql语句自动参数化处理以及执行计划重用
我们知道,SqlServer执行sql语句的时候,有一步是对sql进行编译以生成执行计划, 在生成执行计划之前会去缓存中查找执行计划 如果执行计划缓存中有对应的执行计划缓存,那么SqlServer就会 ...
- SQL点滴27—性能分析之执行计划
原文:SQL点滴27-性能分析之执行计划 一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作.我深信实践中得到的经验是最珍贵的,书本知识只是一个引导.本篇来源于<I ...
- SQL Server INSET/UPDATE/DELETE的执行计划
DML操作符包括增删改查等操作方式. insert into Person.Address (AddressLine1, AddressLine2, City, StateProvinceID, Po ...
- SQL SERVER读书笔记:执行计划
执行计划对性能影响甚大. 系统是怎么得出一个号的执行计划的?主要是依赖于准确的统计信息.统计信息准确的前提下,执行语句重用性高,可避免频繁编译,这也有助于提高性能. 但如果怀疑统计信息不够准确,可以强 ...
- 多线程处理慢sql查询小笔记~
多线程处理慢sql查询以及List(Array)的拆分 系统数据量不大,但是访问速度特别慢,使用多线程优化一下!!! 优化结果:访问时间缩短了十几秒 25s --> 8s 一.List的拆分: ...
- SQL SERVER读书笔记:内存
系统先操作地址空间,真正要用的时候才申请物理内存,进行使用. Reserved Memory 保留内存,虚拟内存 Commited Memory 提交内存,物理内存 [如何判断SQL SERVER ...
随机推荐
- 2、Libgdx配置你的开发环境(Eclipse,Intellij IDEA,NetBeans)
Libgdx 项目使用 Gradle管理依赖,构建过程和IDE整合.这使得你可以使用你喜欢的开发环境开发你的应用.不要提交跟IDE的特定文件到你的源码控制系统中. 配置Eclipse 要想通过Ecli ...
- vim的颜色修改,高亮设置。
在vim.org 搜一下,下载一个color scheme, 放到~/.vim/colors/下(linux)或者$HOME/.vim/colors/下(windows) 再在你的.vimrc文件中加 ...
- MacBook 最近发现的一些问题和技巧
本猫的mba最近键盘莫名会失灵,但用鼠标切换其他用户时时好的,切换回来又不行,体现如下: 1.Spotlight里可以输入,其他不可以 2.cmd+tab可以切换进程 现在只有重启后才可以恢复. 网上 ...
- [转]Android长度单位详解
android中定义的dimension单位有以下这些:px(Pixels ,像素):对应屏幕上的实际像素点.in(Inches ,英寸):屏幕物理长度单位.mm(Millimeters ,毫米):屏 ...
- Android调用binder实现权限提升-android学习之旅(81)
当进程A权限较低,而B权限较高时,容易产生提权漏洞 fuzz测试的测试路径 First level Interface是服务 Second level Interface是服务中对应的接口 1.首先获 ...
- 集群通信组件tribes之使用方法
上面已经对tribes的内部实现机制及原理进行了深入的剖析,在理解它的设计原理后看看如何使用tribes,整个使用相当简单便捷,只需要四步: ① 定义一个消息对象,由于这个消息对象是要在网络之间传递的 ...
- x265 (HEVC编码器,基于x264) 介绍
x265要出来了.简单翻译了一下项目网站首页的介绍. x265是一个开源项目,是一个将视频编码为h.265/高效率的视频编码(HEVC)格式的免费的库,在GNU GPL条款下发布.它的源代码是免费提供 ...
- 加载SpriteBuilder中的scene为何不能带后缀
我们在Xcode中切换SpriteBuilder中的scene时,一般使用的是如下代码: -(void)exitButtonPressed:(CCControl*)sender{ CCLOG(@&qu ...
- Unix - ls命令的简要实现
#include <dirent.h> 是POSIX.1标准定义的unix类目录操作的头文件,包含了许多UNIX系统服务的函数原型,例如opendir函数.readdir函数. opend ...
- 用shell脚本挂载linux主机拷贝相应文件
#!/bin/sh TARGETIP=192.168.88.3 #这里是你要挂在的ftp服务器的IP地址 MOUNTDIR=/mnt TARGETDIR=/root/Desktop/Work ERRO ...