SQL Server 执行计划解析

前置说明:

本文旨在通过一个简单的执行计划来引申并总结一些SQL Server数据库中的SQL优化的关键点,日常总结,其中的概念介绍中有不足之处有待补充修改,希望大神勘误。

SQL语句如下:

SELECT <所需列>  --列太多,不一一列出
  FROM study1
 INNER JOIN series1
    ON (study1.study_uid_id = series1.study_uid_id) --连接条件1
 INNER JOIN image1 image1
    ON (series1.series_uid_id = image1.series_uid_id) --连接条件2
 where ((study1.user_group &8) != 0)  --过滤条件1
   and (series1.modality) not in (‘PR‘, ‘KO‘, ‘SR‘, ‘AU‘) --过滤条件2
   and study1.study_uid =‘xxx‘ --过滤条件3
 order by <排序列>; --列太多,不一一列出

第一部分:执行计划怎么看?

1.从右往左看 + 从上往下看

同一行的执行计划步骤,右边的先执行。同一列的执行步骤,上边的先执行。

SQL Server优化器根据统计信息生成执行计划,由返回行数和统计信息直方图决定执行的先后顺序和表连接方式,但是最基本的一点:过滤条件先于与连接条件执行还是要遵守的。

表连接方式包含nested loop,merge join,hash join这三种,三种连接方式的区别有兴趣可以bing搜索查看,与Oracle的三种表连接方式一样,这里不再详述。

步骤一:根据统计信息发现3个where条件中【过滤条件3】的选择性最好,预估行数最少,于是放在执行计划最右。由于study_uid是主键,无需回表(即无需书签查找),因此实际上步骤一的聚集索引查找同时还兼顾了【((study1.user_group &8) != 0)】这个【过滤条件2】。

步骤一对应过滤条件1、3。

步骤二:这个index seek是根据步骤一得到的study_uid_id结合【连接条件1】,对series_index进行的索引查找,series_index是series表的study_uid_id这列的索引。

步骤三:步骤一和步骤二通过【连接条件1】进行nested loop合成一个中间表,这个中间表中有从series_index中拿到的series表的主键值,有了这个主键值我们就可以在步骤四中进行针对series的主键键查找。

步骤三对应连接条件1。

步骤四:这一步的目的就是通过步骤三得到的series表主键值,到series的聚集索引中找到主键对应的完整的行,在完整行记录中找到对应【过滤条件2】的行记录。

步骤四对应过滤条件2。

步骤五:步骤三、四通过nested loop合成一个中间表,这里的nested loop并不对应某个连接条件,只是纯粹的为了生成一个中间表。

步骤六:根据步骤五中间表里的series_uid_id值到image1表中进行索引查找,image_index就是image1.series_uid_id列的索引。

步骤七:步骤五、六进行nested loop生成中间表,这个中间表中含有image1表的主键值,这个主键值是执行步骤六时从image_index中拿到的。拿到这主键值我们就可以在步骤八中去取到最终我们需要的所有image1表的列了。

步骤七对应连接条件2。

步骤八:根据步骤七中间表中的image1主键值,到image1的主键聚集索引中去取我们需要的image1的列数据。

步骤九:步骤七、八进行nested loop生成最后的中间表。

步骤十:对步骤九中生成的中间表进行排序。

最终,我们就取到了需要的、排序好的所有数据。

2.查看每一步的详细信息

在出现错误的执行计划时,有时我们需要判断为什么优化器选错了执行计划,由于选错执行计划很有可能导致SQL语句变慢,因此搞清其中的原因是很有必要的。

将鼠标移到每一个执行计划node,会出现如下图所示的详细信息。

我们需要关注的主要有以下几点:

  • 物理运算和逻辑运算:

逻辑运算表明了本步骤执行计划做了什么,而物理运算表明用哪种方式做的。一般物理运算和逻辑运算名字相同,也有例外如Aggregate这种逻辑运算就包含流聚合和哈希匹配两种物理实现方式。

    一.表连接的物理运算方式

1.嵌套循环

Logical Operation:nested loop

2.哈希连接

Logical Operation:hash join

3.合并连接

Logical Operation:merge join

    二.索引访问的物理运算方式

1.索引扫描

Logical Operation:index scan

2.索引查找

Logical Operation:index seek

3.聚集索引扫描

Logical Operation:cluster index scan

4.聚集索引查找

Logical Operation:cluster index seek

    三.表访问的物理运算方式

1.表扫描

Logical Operation:table scan

2.RID查找

Logical Operation:RID lookup

3.键查找

Logical Operation:key lookup。

(以前的bookmark lookup在SQL Server 2005之后被细分为RID lookup和key loopkup)

##关于RID LOOKUP和KEY LOOKUP的区别,一个是无主键一个是有主键时候出现的,RID LOOKUP的效率不如KEY LOOKUP,因此微软警告表一定要有主键##

    四.其他的物理运算方式:

1.排序

Logical Operation:sort

2.流聚合和哈希匹配

Logical Operation:Aggregate。

在相应排序的流中,计算多组行的汇总值。group by子句出现时出现,一般配合min,max,avg,count,sum等组函数。哈希匹配适用于排序量较大时,优化器总是选择流聚合和哈希匹配两种物理运算中代价较小的一种。

3.计算标量

Logical Operation:Compute scalar,count(),avg(),sum()等计算组函数出现时出现,一般出现在流聚合物理运算之后,哈希匹配自带计算标量功能。

4.并行

Logical Operation:Parallel,与并行开销阈值和预估的执行时间有关。

  • 估计行数

根据统计信息估算出的中间表或结果集的行数。与最终的运行结果记录数比较可以推断出统计信息是否失真。

  • 谓词(或seek 谓词,有时两者一起出现)

表示SQL语句的过滤条件或内部过滤条件。

第二部分:怎么优化?

SQL Server的优化还是相对简单的,大致分为以下几种:

1.统计信息失真引起的

更新统计信息即可。

2.索引缺失或者索引过多或索引错误引起的

增删索引,或者更改联合索引顺序或者加包含列即可。

3.语句太烂引起的

具体情况具体改写吧......幺蛾子太多列不出来了。

时间: 2024-12-11 03:22:26

SQL Server 执行计划解析的相关文章

SQL Server执行计划的理解

原文:SQL Server执行计划的理解 要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. 名词解析: 扫描:逐行遍历数据. 先建立一张表,并给大家看看大概是什么样子的. CREATE TABLE Person( Id int IDENTITY(1,1) NOT NULL, Name nvarchar(50) NULL, Age int NULL

SQL Server执行计划那些事儿(3)——书签查找

接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. 在刚开始工作时候,总以自己有个“高科技”的工作,而感到特别神气,经常在其他人面前说一些让别人觉得高大上的措辞,到后来会在学妹面前炫耀的讲一下SQL Server的执行计划,这个时候别说执行计划了,就是SQL的优化对我来说还是个新鲜的事物,总是以自己能正确查出结果而沾沾自喜.然而,当真有不经世事的学妹

SQL Server执行计划那些事儿(2)——查找和扫描

接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. 开门见上,直接入题 在查看执行计划时候,你是否曾经也和我一样,有这样的疑惑呢?查找和扫描究竟是什么,以及他们的在查询性能上有什么区别.下面分享下我的理解. 扫描和查找是SQL Server从表或索引中读取数据所采用的迭代器,又因为经常在执行计划中看到,因此理解他们之间的区别,对我们优化查询有很重要的

sql server 执行计划(execution plan)介绍

sql server 执行计划(execution plan)介绍 大纲:目的介绍sql server 中执行计划的大致使用,当遇到查询性能瓶颈时,可以发挥用处,而且带有比较详细的学习文档和计划,阅读者可以按照我计划进行,从而达到对执行计划一个比较系统的学习. 什么是sql server 执行计划 sql server 执行计划的大致使用 学习计划 1.什么是sql server 执行计划 执行计划是查询优化器对我们提交的T-SQL查询请求的最有效方法的的执行结果,执行计划可以告诉我们查询是如何

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要. 目录 概述 基础概念 怎样缓存执行计划 SQL Server自动删除执行计划 重新编译执行计划 测试 执行计划相关系统视图 手动清空缓存执行计划 测试索引更改对执

浅析SQL SERVER执行计划中的各类怪相

在查看执行计划或调优过程中,执行计划里面有些现象总会让人有些疑惑不解: 1:为什么同一条SQL语句有时候会走索引查找,有时候SQL脚本又不走索引查找,反而走全表扫描? 2:同一条SQL语句,查询条件的取值不同,它的执行计划会一致吗? 3: 同一条SQL语句,其执行计划会变化,为什么 4: 在查询条件的某个或几个字段上创建了索引,执行计划就一定会走该索引吗? 5:同时存在几个索引,SQL语句会走那个索引? ..............................................

SQL Server 执行计划操作符详解(2)——串联(Concatenation )

本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻想一下是干嘛的.其实还是挺直观,就是把东西连起来,那么下面我们来看看到底连什么?怎么连?什么时候连? 简介: 串联操作符既是物理操作符,也是逻辑操作符,在中文版SQL Server的图形化执行计划中称为"串联",在其他格式及英文版本中称为"Concatenation".

SQL Server 执行计划中的扫描方式举例说明

原文地址:http://www.cnblogs.com/zihunqingxin/p/3201155.html 1.执行计划使用方式 选中需要执行的语句,点击Ctrl+L执行 2.示例student表,id,name,addressid上建立聚集索引Name建索引address无索引 3.区别1. [Table Scan]:遍历整个表,查找所有匹配的记录行.这个操作将会一行一行的检查,当然,效率也是最差的.以无索引字段为条件,按存放顺序一个个查,where address='123' 2. [I

引用:初探Sql Server 执行计划及Sql查询优化

原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划. 网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚至几MS的时