T-SQL | 你需要了解的执行计划
【T-SQL】| 作者 / Edison Zhou
这是EdisonTalk的第297篇学习分享
T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL。本文是我学习《T-SQL查询》一书的读书笔记,为你讲解执行计划是个什么鬼。
1关于执行计划
执行计划是优化器生成的用于确定如何处理一个给定查询的“工作计划”。一个计划包含一组运算符,通常按照特定的顺序来应用这些运算符。
此外,一些运算符可以在它们之前的运算符还在处理时被应用(即不一定是完全串行),还有一些运算符也有可能被应用多次。
2图形化执行计划
SSMS中的图形化执行计划
在SSMS(SQL Server Management Studio)中,有两种图形化的执行计划可供选择。一种是估计执行计划(Ctrl+L键),另一种是实际执行计划(Ctrl+M键)。两种计划通常都是一样的,只是执行时间点不同。估计查询计划是在查询执行之前生成,而实际执行计划则是在查询输出的同时得到的。
图形化执行计划实例讲解
Step1.示例查询介绍
(1)假设我们有一张Orders表,里面有100w行订单数据,从2005年开始到2009年。
(2)待分析的查询语句
-- 图形化执行计划查询示例
SELECT custid, empid, shipperid, COUNT(*) AS numorders
FROM dbo.Orders
WHERE orderdate >= '20080201'AND orderdate < '20080301'
GROUP BY CUBE(custid, empid, shipperid);
GO
Step2.估计的执行计划查看(选中SQL语句按Ctrl+L)
当我们将光标移动到某个运算符上面时,可以得到该运算符返回的估计行数和开销。箭头的粗细与源运算符返回的行数是成正比的。所以,重点关注比较粗的箭头,它们可能预示着性能问题。
Step3.实际的执行计划(先选中“包括实际的执行计划”,再执行该查询,即可同时得到查询的输出和实际的计划)
这时再把光标移到某个运算符,看到的会变为“实际行数”。
Step4.缩放到合适的大小
*.如果得到了一个无法适合屏幕显示的计划时,可以使用一个很酷的功能,叫做缩放到合适大小。(点击鼠标右键出现菜单,选择即可)
点击后,执行计划会变为如下图所示:
Step5.执行计划是由运算符组成的一个树状结构,在图形化计划中,是从右到左从上到下的顺序来表示的。在这个例子中,聚集索引查找(Clustered Index Seek)是数据流的第一个运算符,生成的输出传到树中的下一个运算符-表假脱机(Eager Spool),以此类推。
我们需要注意与每个运算符相关联的开销百分比,这个值是某个运算符的开销占查询全部开销的百分比,由优化器估算。这里,我们需要多留意一下百分比值比较高的运算符,重点对这些运算符进行优化。
此外,当我们将光标放在一个运算符上面时,其中有一项叫做“估计子树大小(Estimated Subtree Cost)”,这个值代表从当前运算符开始的子树的累计估计大小。比如,这里我们通过将光标移动到最左边的SELECT运算符,即根节点,可以看到整个查询的估计开销(因为其子树代表了整个查询)。
比较多个查询的开销
图形化执行计划的另一个有用的功能就是可以方便地比较多个查询的开销。
假设我们想比较以下几个实现类似目标的查询的开销:
SELECT custid, orderid, orderdate, empid, filler
FROM dbo.Orders AS O1
WHERE orderid =(SELECT TOP (1) O2.orderidFROM dbo.Orders AS O2WHERE O2.custid = O1.custidORDER BY O2.orderdate DESC, O2.orderid DESC);SELECT custid, orderid, orderdate, empid, filler
FROM dbo.Orders
WHERE orderid IN
(SELECT(SELECT TOP (1) O.orderidFROM dbo.Orders AS OWHERE O.custid = C.custidORDER BY O.orderdate DESC, O.orderid DESC) AS oidFROM dbo.Customers AS C
);SELECT A.*
FROM dbo.Customers AS CCROSS APPLY(SELECT TOP (1) O.custid, O.orderid, O.orderdate, O.empid, O.fillerFROM dbo.Orders AS OWHERE O.custid = C.custidORDER BY O.orderdate DESC, O.orderid DESC) AS A;WITH C AS
(SELECT custid, orderid, orderdate, empid, filler,ROW_NUMBER() OVER(PARTITION BY custidORDER BY orderdate DESC, orderid DESC) AS nFROM 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)
https://technet.microsoft.com/zh-cn/library/ms178071(v=sql.105).aspx
Ref参考资料
[美] Itzik Ben-Gan 著,《SQL Server 2008技术内幕:T-SQL查询》
????扫码关注EdisonTalk
设为星标,不再失联!
往期推文合集:2020年上半年推文合集
更多SQL文章:每天10分钟T-SQL系列
T-SQL | 你需要了解的执行计划相关推荐
- [sqlserver脚本]查看指定SQL语句生成了哪些执行计划
参考SQL技术内幕写了一段脚本,可以通过这段脚本查看执行指定SQL语句后,系统生成了哪些执行计划.使用时注意以下几点: 修改use MyTest,换成自己的数据库名字. 将 exec sp_page_ ...
- sql server运算符_SQL Server执行计划中SELECT运算符的主要概念
sql server运算符 One of the main responsibilities of a database administrator is query tuning and troub ...
- sql server 数据库优化--显示执行计划
刚开始用SQL Server的时候,我没有用显示执行计划来对查询进行分析.我曾经一直认为我递交的SQL查询都是最优的,而忽略了查询性能究竟如何,从而对"执行计划"重视不够.在我职业 ...
- 达梦数据库SQL调优,查看执行计划、ET
一.调优目标 SQL 调优的整体目标是使用最优的执行计划,使IO以及CPU代价最小.调优主要关注下列方面: ·表扫描 如果计划中对某大表使用了全索引扫描,那么需要关注该表是否存在某个查询条件使得过滤后 ...
- oracle 相同的sql执行两次 执行计划会不一样吗,一条SQL语句,两次执行计划的差距...
jonas_li 发表于 2013-12-18 15:14 执行计划也可以贴出来,看看,是否真的如此 Execution Plan ---------------------------------- ...
- Oracle 高性能SQL引擎剖析----执行计划
执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行 ...
- EXPLAIN PLAN获取SQL语句执行计划
一.获取SQL语句执行计划的方式 1. 使用explain plan 将执行计划加载到表plan_table,然后查询该表来获取预估的执行计划 2. 启用执行计划跟踪功能,即autotrace功能 3 ...
- SQL语言之执行计划(Oracle)
执行计划 一条查询语句在Oracle中的执行过程或访问路径的描述: 一.配置执行计划需要显示的项(pl/sql developer) 二.执行计划的常用列字段解释 基数(Cardinality):O ...
- 剖析SQL Server执行计划
-->Title: 淺議SQL Server执行计划 -->Author: wufeng4552 -->Date :2009-10-20 15:08:24 前言: 最近溫習了執行計劃 ...
- 了解Sql Server的执行计划
前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句.但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性 ...
最新文章
- Apache的性能优化
- jQuery 事件
- oracle备份及恢复
- Cloud Studio全文搜索功能介绍
- 简记用ArcGIS处理某项目需求中数据的步骤
- IBM收购Rational一年总结
- java 一元线性回归_一元线性回归的java实现
- linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响
- linux编译bzip2,linux bzip2 命令详解
- MAVLink 协议解析之XML定义篇
- Jira Bamboo中创建Windows Remote Agent的注意事项
- CommandBehavior.CloseConnection使用
- 语录帝——要想人前显贵,必须背地里遭罪
- 路由侠(连接外网工具) v1.0 官方最新版
- matlab对图像处理差分,MATLAB图像处理实例详解
- C语言 switch 企业奖金,企业发放的奖金根据利润提成 switch 或 if 语句编程 C++源代码...
- 声学模型(一) hmm声学训练流程
- linux安装vsftpd
- 冒泡排序与快速排序比较
- 这届勒索病毒,其实很有上进心呀