了解Sql Server的执行计划
前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句。但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性能问题,这才是我们的最终目的,那么如何使用执行计划呢?我准备从以下几点来总结。
- 如何启动执行计划
- 执行计划结果要看什么
- Sql Server的五种查找方式
- 查看更具体的执行过程
如何启动执行计划
运行一条sql,并且在工具栏中选中'Include Actual Execution Plan'按钮,此时就启动了执行计划,如下图。

Sql语句:
USE TSQLFundamentals2008;
GO -- 查询2006年7月1日到2007年7月31日的所有订单,并按requireddate字段排序
SELECT orderid,orderdate,requireddate,shippeddate,shipname,shipaddress FROM Sales.Orders
WHERE orderdate>='' AND orderdate<''
ORDER BY requireddate;
执行查询,可以在结果栏中看到执行计划结果,如下图。

执行计划结果要看什么
执行计划结果出来了,那我们要怎么看呢?一般我们只需关注以下几个参数。
- 哪一步开销较高。开销较高的地方说明这个地方查询比较耗时。
- 哪些步骤所影响的数据行较多。这个可以通过连接线条的粗细来判断。
- 每一步做了些什么事情。
Sql Server的五种查询方式
要了解Sql Server的五种查询方式之前,我们要弄明白两个概念,Sql Server中的两种索引,聚集索引和非聚集索引。【聚集索引】直接决定了记录的存放位置,或者说,根据聚集索引可以直接获取到该记录,一般我们表的主键都是用聚集索引。【非聚集索引】则保存了二个信息,1.相应索引字段的值。2.记录对应聚集索引的位置(如果表没有聚集索引则保存记录指针)。因此,如果能通过聚集索引来查找记录,则速度是最快的。
下面是Sql Server查询数据的五种方式,这对我们理解执行计划非常重要。五种方式如下。
- 【Table Scan】:遍历整个表来查找匹配的数据行,速度最慢。
- 【Index Scan】:依据索引先从表中过滤出一部分记录,然后再查找所有匹配的数据行。查询速度比Table Scan稍快。
- 【Index Seek】:依据索引,定位记录的存放位置,然后再取得记录,因此,其查询速度比前面两种都快。
- 【Clustered Index Scan】:按聚集索引(一般是主键)遍历整个表,因为它的记录就是按聚集索引来顺序存放的。注意它与Table Scan的区别,其实它们都是进行全表扫描,只不过Table Scan是不带索引的扫描,而Clustered Index Scan是按聚集索引扫描的。
- 【Clustered Index Seek】:聚集索引获取记录,它是直接拿到那条记录,而没有进行全表扫描,因此它的查询速度是最快的。
当我们查看执行计划结果的时候,如果看到【Table Scan】,说明这个表没有建立任何索引,包括聚集索引。但往往看到更多的是【Clustered Index Scan】,表示该查询还是扫描了速个表,只不过是按聚集索引,实际效果还是和【Table Scan】没什么区别,因此,这时候我们可能要考虑建立'组合字段索引'。
查看更具体的执行过程
能过执行计划的结果图我们只能看出哪一块比较耗时,但是看不到Sql Server具体是怎么执行的。为了看得更明白,我们可以通过一条sql命令来查看,如下代码。
SET STATISTICS PROFILE ON;
执行结果除了返回数据集和执行计划外,还返回了一个表显示具体的执行过程,如下图。

这个结果我们重点要关注以下几点:
- Stmt Text:所执行的步骤详细描述,一般从最内层往外看。
- Rows:表示该执行步骤所产生的记录数。
- Executes:表示某执行步骤被执行的记录数。
参考资料
1,Fish Li的 看懂SqlServer查询计划
2,田园里的蟋蟀的 程序员眼中的 SQL Server-执行计划教会我如何创建索引?
了解Sql Server的执行计划的更多相关文章
- SQL Server 优化-执行计划
对于SQL Server的优化来说,优化查询可能是很常见的事情.由于数据库的优化,本身也是一个涉及面比较的广的话题, 因此本文只谈优化查询时如何看懂SQL Server查询计划.毕竟我对SQL Ser ...
- SQL Server实际执行计划COST"欺骗"案例
有个系统,昨天Support人员发布了相关升级脚本后,今天发现系统中有个功能不能正常使用了,直接报超时了(Timeout expired)的错误.定位到相关相关存储过程后,然后在优化分析的过程中,又遇 ...
- 程序员眼中的 SQL Server-执行计划教会我如何创建索引?
先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...
- SQL SERVER 2012 执行计划走嵌套循环导致性能问题的案例
开发人员遇到一个及其诡异的的SQL性能问题,这段完整SQL语句如下所示: declare @UserId INT declare @PSANo VAR ...
- SQL Server-执行计划教会我如何创建索引
先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...
- Sql Server中执行计划的缓存机制
Sql查询过程 当执行一个Sql语句或者存储过程时, Sql Server的大致过程是 1. 对查询语句进行分析,将其生成逻辑单元,并进行基本的语法检查 2. 生成查询树(会将查询语句中所有操作转换为 ...
- sql server 根据执行计划查询耗时操作
with QS as( select cp.objtype as object_type, /*类型*/ db_name(st.dbid) as [database], /*数据库*/ object_ ...
- sql server 2008 执行计划
SSMS允许我们查看一个图形化的执行计划(快捷键Ctrl+L)
- SQL Server控制执行计划
为了提高性能,可以使用提示(hints)特性,包含以下三类: 查询提示:(query hints)告知优化器在整个查询过程中都应用某个提示 关联提示:(join hints)告知优化器在查询的特定部分 ...
随机推荐
- MongoDb 聚合报错
聚合框架它是数据聚合的一个新框架,其概念类似于数据处理的管道. 每个文档通过一个由多个节点组成的管道,每个节点有自己特殊的功能(分组.过滤等),文档经过管道处理后,最后输出相应的结果. 管道基本的功能 ...
- 数据库的Index Scan V.S. Rscan
一直在做performance,但直到今天才完成了这个第一天应该完成的图,到底Index scan和Rscan的分界点在哪里? 如下图所示,很简单的一个查询,只是查询int,分别强制走索引和表扫描 ...
- [6] 智能指针boost::weak_ptr
[1]boost::weak_ptr简介 boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include<boost/weak_ptr.hp ...
- mysql重复索引、冗余索引、未使用索引的定义和查找
1.冗余和重复索引 mysql允许在相同列上创建多个索引,无论是有意还是无意,mysql需要单独维护重复的索引,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能.重复索引是指的在相同的列上 ...
- [转]tomcat中的session管理
转载地址:http://blog.csdn.net/iloveqing/article/details/1544958 当一个sesson开始时,Servlet容器会创建一个HttpSession对象 ...
- hdu 5751 Eades
题意:对于整数序列$A[1...n]$定义$f(l, r)$为区间$[l, r]$内等于区间最大值元素的个数,定义$z[i]$为所有满足$f(l, r)=i$的区间总数.对于所有的$1 \leq i ...
- Auty自动化测试框架第六篇——垃圾代码回收、添加suite支持
[本文出自天外归云的博客园] 垃圾代码回收 添加脚本恢复机制,因为框架会自动生成一些代码,如果代码生成后出现问题导致代码没有正常删除掉,则会造成代码垃圾,在auty目录添加recovery.py文件: ...
- PetaPoco入门(二)
1. Petapoco基本用法 1.1. 创建示例工程 首先创建一个工程文件,为了便于展示数据这里创建一个类型为:WindowsApplication的工程文件.命名为:PetapocoTest. 程 ...
- 2016年12月25日 星期日 --出埃及记 Exodus 21:20
2016年12月25日 星期日 --出埃及记 Exodus 21:20 "If a man beats his male or female slave with a rod and the ...
- 第四章 函数(JavaScript:语言精粹)
函数包含一组语句,用来指定对象的行为,其代码可以用来重复使用. 一般来说,编程就是将一组需求分解成一组函数和数据结构的技能. 概览:函数对象 | 函数字面量 | 调用 | 方法调用模式 | 函 ...