sqlserver 执行计划

article/2025/9/29 5:30:55

一个很好的手册分享,执行计划里的属性解释官方文档:https://docs.microsoft.com/zh-cn/sql/relational-databases/showplan-logical-and-physical-operators-reference?view=sql-server-2017

想复杂的事情简单说,在看执行计划的其他文章的时候,发现直接上很复杂的DDL脚本来讲解,这样子可能打开就没有兴趣往下看了。所以这里用了一个最简单的select语句进行说明引新入门。

打开

注意这三个【L型图标】,可以把鼠标移动到按钮上方可以显示【解释文字】。

图中从左到右分别为【显示估计的执行计划】【包括实际的执行计划】【包括实时查询统计信息】。

【显示估计的执行计划】是执行某个DDL的估计值。

【包括实际的执行计划】【包括实时查询统计信息】都是执行实际的值,所以你选择后,它会在下次执行后出执行结果。

结果分析

这是一个简单的查询,鼠标点击图片中的图片或线上都有惊喜(大量细节信息展示)。执行计划可以通过“另存”操作将某一次结果保留下来,方便与日后进行结果对比。

除了图标外,线的粗细代表涉及到的数据量的大小,越粗代表数据量越大。

执行计划元素列表如下:

  
Select (Result)SortSpool
Clustered Index ScanKey LookupEager Spool
NonClustered Index ScanCompute ScalarStream Aggregate
Clustered Index SeekConstant ScanDistribute Streams
NonClustered Index SeekTable ScanRepartition Streams
Hash MatchRID LookupGather Streams
Nested LoopsFilterBitmap
Merge JoinLazy SpoolSplit

执行计划元素列表解释请参考:

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms175913(v=sql.105)

https://lvraikkonen.github.io/2017/06/02/%E7%9C%8B%E6%87%82SQL%20Server%E6%89%A7%E8%A1%8C%E8%AE%A1%E5%88%92/

结果细节图

 

其中,第三个图中的属性Ordered是与order by相关。如下面两个脚本:

select * from vvtest order by id;
select * from vvtest

两个执行计划的结果如下:

 

所谓数据访问就是直接访问数据,可以是访问一个表也可以是访问一个索引。

通常有两种方法:一种是扫描(scan)一种是查找(seek)。

  • scan就是读取整个结构,可以访问一个heap或者一个clustered索引或者一个non-clustered索引。
  • seek不会读取整个结构,他则是更高效地通过索引访问一行,所以从这个角度来看,查找就只能应用在索引上面了。简单总结如下表所示:

首先分析最右边的Table Scan。这是sqlserver 查询数据的方法。sqlserver 数据查询方式一共有五种:

1. 【Table Scan】:遍历整个表,查找所有匹配的记录行。这个操作将会一行一行的检查,当然,效率也是最差的。
2. 【Index Scan】:根据索引,从表中过滤出来一部分记录,再查找所有匹配的记录行,显然比第一种方式的查找范围要小,因此比【Table Scan】要快。
3. 【Index Seek】:根据索引,定位(获取)记录的存放位置,然后取得记录,因此,比起前二种方式会更快。
4. 【Clustered Index Scan】:和【Table Scan】一样。注意:不要以为这里有个Index,就认为不一样了。 其实它的意思是说:按聚集索引来逐行扫描每一行记录,因为记录就是按聚集索引来顺序存放的。 而【Table Scan】只是说:要扫描的表没有聚集索引而已,因此这二个操作本质上也是一样的。
5. 【Clustered Index Seek】:直接根据聚集索引获取记录,最快!

所以总体来讲,在查询结果集是相同数量的情况下,查询速度排序为5>3>2>4>1。

一般而言,在性化时可以看到执行记录时是不是【Table Scan】或者【Clustered Index Scan】,如果是,可以通过增加或修改索引类型进行效率上的对比。

Lookup类型

我是真的服气这么多名词解释。

Bookmark Lookup、RID Lookup、Key Lookup。

Bookmark Lookup和Key Lookup是一个意思,等价。

如果表没有创建聚集索引则称为Bookmark Lookup,如果表中没有聚集索引但是存在非聚集索引我们称为RID Lookup。

为什么突然扯了一嘴Lookup呢?因为Lookup其实就是与执行计划里的scan或index相关。如果聚集索引命中就是指Bookmark Lookup——聚集索引命中的时候,很大概率是索引不能带出select所需的某一部分字段或者是全部字段,所以需要先命中一行,然后把某一行的数据全带出来。非聚集索引命中就是指RID Lookup。

SQL SERVER如何选择执行计划

sqlserver选择某个执行计划,执行计划用某个索引,是这有一个权重判断的。这个权重在执行前都计算出来了。那怎么查看呢——通过【索引统计信息】。在执行脚本的过程中,sqlserver会根据这些统计信息,选择一个它认为是最合适的方法去执行查询过程。统计信息可以自动定时更新,在SQL Server中也有个参数来控制这个更新方式。

语法

DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid);

这里的引号很重要,没会报错。

主要有两个参数:

第一个:是表名或者是索引视图名(给视图加的索引)

第二个:索引名、列名、统计信息。

结果属性介绍

索引前缀集是什么?索引前缀和前缀索引不是一个东西。

索引前缀是指索引的选择性——根据索引定义时的字段顺序来决定索引是否被命中。如果是索引(a,b,c),命中查询的时候是查询条件中有(a) (a,b) (a,b,c)进行命中,但是(b,c)这个查询条件不会命中该索引。所以索引前缀也叫索引列前缀集。

前缀索引说白了就是对文本的前几个字符(具体是几个字符在建立索引时指定)建立索引,这样建立起来的索引更小,所以查询更快。

索引统计信息属性介绍
属性介绍备注
表1列出了这个索引统计信息的主要信息。--
Name统计信息的名称语法里的第二个参数
Updated上一次更新统计信息的日期和时间。 
Rows表中的行数。 
Rows Sampled统计信息的抽样行数。 
Step

数据可分成多少个组,与第三个表有多少行相对应。

 
Desity中文翻译:密度。根据索引列计算不同值的分布密度。Calculated as 1 / distinct values for all values in the first key column of the statistics object
Average key Length所有索引列的平均长度。 
String Index如果为“YES”,则统计信息中包含字符串摘要索引,以支持为 LIKE 条件估算结果集大小。仅适用于 charvarcharnchar 和 nvarcharvarchar(max)nvarchar(max)text 以及 ntext 数据类型的前导列 
Filter Expression谓词表达式 
Unfiltered Rows

上面的Filter Expression所操作的数据总行数

为NULL,代表Filter Expression没有匹配到具体数据。

 
表2它列出各种字段组合的选择性,数据越小表示重复越性越小,当然选择性也就越高。--
All density索引列前缀集的选择性(包括 EQ_ROWS)。注意:这个值越小就表示选择性越高。如果这个值小于0.1,这个索引的选择性就比较高,反之,则表示选择性就不高了。
Average Length索引列前缀集的平均长度。 
Columns为其显示 All density 和 Average length 的索引列前缀的名称 
表3数据分布的直方图,SQL Server就是靠它预估一些执行步骤的数据量。--
RANGE_HI_KEY直方图的数据最大值 
RANGE_ROWS每组数据组的估算行数,不包含最大值。 
EQ_ROWS每组数据组中与最大值数据(RANGE_HI_KEY)相等的行数目估计值
DISTINCT_RANGE_ROWS每组数据组中的非重复值的估算数目,不包含最大值。 
AVG_RANGE_ROWS每组数据组中的重复值的平均数目,不包含最大值,计算公式:RANGE_ROWS / DISTINCT_RANGE_ROWS for DISTINCT_RANGE_ROWS > 0 
   

 

执行计划详细属性介绍

在执行DDL之前,输入一句set statistics profile on 。显示一个表格,表格内是比图上更细节的实际的执行信息。针对这个表的属性做一个整理解析。

执行计划属性
属性字段介绍备注
Rows(重要属性)在某个步骤中,实时产生的记录条数真实数据
Executes(重要属性)某个步骤被执行的次数。真实数据
StmtTest(重要属性)

执行步骤的描述

1)  |--Table Scan(OBJECT:([master].[dbo].[vvtest]))

2)  |--Clustered Index Scan(OBJECT:([master].[dbo].[vvtest].[ClusteredIndex-20190531-153224]))

3)select * from vvtest

1和2是加了没有聚集索引和把id作聚集索引后的对比。3是DDL是执行计划最外层的脚本执行。2中的加黑部分是在查询方式是Clustered Index Scan的时候他使用到的索引名称。

所以这个属性可以看到使用的索引和实际步骤里执行的DDL脚本。

StmtId

当前执行语句的单条DDL的编号。

set statistics profile on 
select * from vvtest order by id;——这条就是1
select * from vvtest——这条就是2
NodeId单条DDL里的步骤编号。从1开始,单个执行计划中箭头最右边是1,最左边(被指的)依次增加,代表单个DDL内的执行顺序。
Parent与该条步骤相关的下一步步骤编号(NodeId) 
PhysicalOpsqlserver 数据查询方式,包括但是不限于我们上面提到的五种Table Scan……只有节点类型Type=PLAN_ROWS 的才有这个属性。Type属性在下方介绍
LogicalOp关系运算符只有节点类型Type=PLAN_ROWS 的才有这个属性。Type属性在下方介绍
Argument被PhysicalOp执行的对象,细节信息,比如说当前被使用到的列名或表名

举例:

Sort——ORDER BY:([master].[dbo].[vvtest].[id] ASC)

Table Scan ——OBJECT:([master].[dbo].[vvtest])

DefinedValues将DDL语句进行细化成一个用逗号分隔的列表。 
EstimateRows估计返回多少行数据估计值
EstimateIO估计IO开销,单位是估计值
EstimateCPU估计CPU开销,计算的是CP占用率(百分比)估计值
AvgRowSize估计本步骤的数据每行平均的字节数,单位是bytes估计值
TotalSubtreeCost估计的本步骤和本步骤涉及到所有子步骤的总消耗的占总的百分比估计值
OutPutList这个属性是一个用逗号分隔的列表。列表里是本步骤执行的DDL,输出涉及到对应表的列名。列名集合
Warnings用逗号分隔的列表,本步骤DDL会触发的警告信息。 
Type节点类型

1)如果是陈述性SQL,那么Type的值为SELECT, INSERT, EXECUTE等。

2)如果是执行计划的子节点(如索引执行的描述),那么Type的值为PLAN_ROW

Parallel

并行标志。

0-本步骤不能并行执行

1-本步骤可以并行执行

 
EstimateExecutions估计本步骤在总的执行中被执行的次数。

估计值。

有可能在脚本中步骤被执行N次

 

以上属性的英文版的解释在:

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-showplan-all-transact-sql?view=sql-server-2017

参考文档:https://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html

https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-show-statistics-transact-sql?view=sql-server-2017


http://chatgpt.dhexx.cn/article/w9jhsejm.shtml

相关文章

MySQL执行计划

什么是执行计划 The set of operations T that the optimizer o chooses to perform the most efficient query t is called the “query execution plan”, also known as theEXPLAIN plan 如何获取SQL语句的执行计划 方法1: explain SQL 。方法2: …

sql 执行计划

一、各数据库执行计划执行方式 二、explan 三种格式 (以MySQL为例) 1.默认格式 2.tree 格式(与postgreSQL执行计划格式相似) 3.json格式 三、执行计划各字段名含义 1) id:查询编号 ,从小到大,编号越大执行顺序越往前 相同的话从上往下执行(也可以把编号当成缩进的格数…

mysql的执行计划_MySQL——执行计划

项目开发中,性能是我们比较关注的问题,特别是数据库的性能;作为一个开发,经常和SQL语句打交道,想要写出合格的SQL语句,我们需要了解SQL语句在数据库中是如何扫描表、如何使用索引的; MySQL提供explain/desc命令输出执行计划,我们通过执行计划优化SQL语句。 下面我们以M…

Oracle查询执行计划

执行计划(Execution Plan)也叫查询计划(Query Plan),它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括: ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。 ● 多表…

oracle执行计划耗费 基数 字节,Oracle 查看执行计划

一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计…

执行计划绑定方法

执行计划突变属于每个数据库系统不可避免页难以预防的难题,处理执行计划突变带来的性能问题也是每个DBA应该具备的技能。除了开发时针对不同范围的结果集使用不同的sql,DBA可以通过查看索引状态、消除索引碎片、表重新分析,还可以使用执行计划…

PostgreSQL执行计划

简介 PostgreSQL是“世界上最先进的开源关系型数据库”。因为出现较晚,所以客户人群基数较MySQL少,但是发展势头很猛,最大优势是完全开源。 MySQL是“世界上最流行的开源关系型数据库”。当前客户基数大,随着被Oracle收购&#…

一文带你了解SQL的执行计划(explain)

一. 什么是SQL执行计划 为什么关注sql的执行计划,因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息 。 通过一个sql计划,如何访问中的数据 (是使用全表扫描还是索引查找?) 一个表中可能存在多个表中不同的…

执行计划

一、什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。 二、如何查看执行计划 1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。 很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信…

matlab画图基本命令

一、本文主要内容和相关参考博客 参考了xticklabel和xtick在matlab里的区别 和 label ‘ytick’的设置这两个网址。matlab在画图时会自动调整坐标轴间隔的大小,但是我们可以使用如set(gca,ytick,ylabel_pos,yticklabel,ylabel_str)的函数来实现自己调整间隔以画出…

MATLAB常用绘图命令

选择图型窗口命令 坐标轴相关命令 文字标示命令 栅格 离散数据处理

MATLAB画图命令zz

一、散点图 1.1.命令 plot 功能 线性二维图。在线条多于一条时,若用户没有指定使用颜色,则plot循环使用由当前坐标轴颜色顺序属性(current axes ColorOrder property)定义的颜色,以区别不同的…

slice matlab,Matlab画图之slice命令

满意答案 7a6o8yb4 2015.08.12 采纳率:55% 等级:8 已帮助:212人 close all; clc; clear; A = [1 2 2 25 1 3 3 21 1 4 4 20 2 5 5 19 2 6 7 31]; x = A(:, 1); y = A(:, 2); z = A(:, 3); s = A(:, 4); % 提取有效数据 xb = min(x); xe = max(x); yb = min(y); ye = max(…

Matlab画图命令介绍

这是matlab里最基本的命令,帮助那些没有学过matlab,只是用它来画画图的人。

matlab画图句柄

Hf_1figure(color, white);figure全部属性 Alphamap: [0 0.0159 0.0317 0.0476 0.0635 0.0794 … ]BeingDeleted: offBusyAction: queueButtonDownFcn: Children: [00 GraphicsPlaceholder]Clipping: onCloseRequestFcn: closereqColor: [1 1 1]Colormap: [2563 double]Context…

【转载】Matlab画图命令介绍

这是matlab里最基本的命令,帮助那些没有学过matlab,只是用它来画画图的人。

matlab 画图 浓淡有别,matlab画图命令汇总

matlab画图命令汇总(2010-11-16 21:46:24) 转载 一、plot系列 plot  |  plot3  |  plotyy  |  polar(极坐标) 二、image系列 image  |  imagesc  |  pcolor(伪彩图)  | 三、contour系列——等高线图 contour  |  contour3  |  contourc  |  …

matlab绘图命令

1、fplot() 该命令常用来绘制符号函数的图像;其具体格式为: fplot(fun,lims),其中fun是符号函数表达式,lims用来声明绘图区间。 例如: 绘制函数:f(x)sinxx; >> lims[-5,5]>> fplot(sin(x)x,lim…

matlab绘图命令总结(重要!!!整理)

基本的绘图流程: (1)数据准备。 (2)设置当前绘图区。 (3)绘图。 (4)设置图形中曲线和标记点格式。 (5)设置坐标轴和网格线属性。 (6&a…

MATLAB常用画图命令汇总

自己在建模时常用到的绘图命令,总结的时候也实操了一下,发现了很多通往新世界的大门 我不生产文章,我只是帮助中心的搬运工~​ (一)二维图像 1.散点图 scatter() ​scatter(x,y,sz,c,mkr.filled,) sz:指…