了解Sql Server的执行计划

  前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句。但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性能问题,这才是我们的最终目的,那么如何使用执行计划呢?我准备从以下几点来总结。

  1. 如何启动执行计划
  2. 执行计划结果要看什么
  3. Sql Server的五种查找方式
  4. 查看更具体的执行过程

如何启动执行计划

  运行一条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>=‘20060701‘ AND orderdate<‘20070801‘
ORDER BY requireddate;

  执行查询,可以在结果栏中看到执行计划结果,如下图。

  

执行计划结果要看什么

  执行计划结果出来了,那我们要怎么看呢?一般我们只需关注以下几个参数。

  1. 哪一步开销较高。开销较高的地方说明这个地方查询比较耗时。
  2. 哪些步骤所影响的数据行较多。这个可以通过连接线条的粗细来判断。
  3. 每一步做了些什么事情。

Sql Server的五种查询方式

  要了解Sql Server的五种查询方式之前,我们要弄明白两个概念,Sql Server中的两种索引,聚集索引和非聚集索引。【聚集索引】直接决定了记录的存放位置,或者说,根据聚集索引可以直接获取到该记录,一般我们表的主键都是用聚集索引。【非聚集索引】则保存了二个信息,1.相应索引字段的值。2.记录对应聚集索引的位置(如果表没有聚集索引则保存记录指针)。因此,如果能通过聚集索引来查找记录,则速度是最快的。

  下面是Sql Server查询数据的五种方式,这对我们理解执行计划非常重要。五种方式如下。

  1. 【Table Scan】:遍历整个表来查找匹配的数据行,速度最慢。
  2. 【Index Scan】:依据索引先从表中过滤出一部分记录,然后再查找所有匹配的数据行。查询速度比Table Scan稍快。
  3. 【Index Seek】:依据索引,定位记录的存放位置,然后再取得记录,因此,其查询速度比前面两种都快。
  4. 【Clustered Index Scan】:按聚集索引(一般是主键)遍历整个表,因为它的记录就是按聚集索引来顺序存放的。注意它与Table Scan的区别,其实它们都是进行全表扫描,只不过Table Scan是不带索引的扫描,而Clustered Index Scan是按聚集索引扫描的。
  5. 【Clustered Index Seek】:聚集索引获取记录,它是直接拿到那条记录,而没有进行全表扫描,因此它的查询速度是最快的。

  当我们查看执行计划结果的时候,如果看到【Table Scan】,说明这个表没有建立任何索引,包括聚集索引。但往往看到更多的是【Clustered Index Scan】,表示该查询还是扫描了速个表,只不过是按聚集索引,实际效果还是和【Table Scan】没什么区别,因此,这时候我们可能要考虑建立‘组合字段索引‘。

查看更具体的执行过程

  能过执行计划的结果图我们只能看出哪一块比较耗时,但是看不到Sql Server具体是怎么执行的。为了看得更明白,我们可以通过一条sql命令来查看,如下代码。

SET STATISTICS PROFILE ON;

  执行结果除了返回数据集和执行计划外,还返回了一个表显示具体的执行过程,如下图。

  这个结果我们重点要关注以下几点:

  1. Stmt Text:所执行的步骤详细描述,一般从最内层往外看。
  2. Rows:表示该执行步骤所产生的记录数。
  3. Executes:表示某执行步骤被执行的记录数。

参考资料

1,Fish Li的 看懂SqlServer查询计划

2,田园里的蟋蟀的 程序员眼中的 SQL Server-执行计划教会我如何创建索引?

时间: 2024-10-12 21:53:54

了解Sql Server的执行计划的相关文章

SQL SERVER 2012 执行计划走嵌套循环导致性能问题的案例

原文:SQL SERVER 2012 执行计划走嵌套循环导致性能问题的案例 开发人员遇到一个及其诡异的的SQL性能问题,这段完整SQL语句如下所示: declare @UserId             INT declare @PSANo              VARCHAR(200) declare @ShipMode           VARCHAR(10) declare @CY_FLAG            VARCHAR(1) declare @PO            

Sql Server中执行计划的缓存机制

Sql查询过程 当执行一个Sql语句或者存储过程时, Sql Server的大致过程是 1. 对查询语句进行分析,将其生成逻辑单元,并进行基本的语法检查 2. 生成查询树(会将查询语句中所有操作转换为对基表的操作,比如将视图转换为基表查询) 3. 生成执行计划(针对查询树会生成很多不同的执行计划) 4. 查询优化器基于每个执行计划的查询成本和数据库中的统计信息,选择一个最优执行计划 5. 最优执行计划会被缓存在数据库的缓存池中.当再次执行相同Sql语句时,缓存的执行计划会被直接使用.这样可以提高

sql server 根据执行计划查询耗时操作

1 with QS as( 2 select cp.objtype as object_type, /*类型*/ 3 db_name(st.dbid) as [database], /*数据库*/ 4 object_schema_name(st.objectid,st.dbid) as [schema], /*架构*/ 5 object_name(st.objectid,st.dbid) as [object], /*对象名*/ 6 convert(char(16),qs.creation_ti

第1周 SQL Server 如何执行一个查询

原文:第1周 SQL Server 如何执行一个查询 大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要,因为接下来的培训中我们会以这些概念来加深我们对SQL Server的认识. 当我们执行一个查询时,在SQL Server中最重要的组件有哪些,下面这张图片可以给大家一个概观的认识. 可以看到,SQL Server内部分成了2个部分:关系引擎和存储

[译]SQL Passion Week 1: SQL Server如何执行一个查询

SQLpassion Performance Tuning Training Plan 个人学习翻译,如有谬误,请不吝指出,感谢.  Week 1: SQL Server如何执行一个查询   在我们进入SQL Server性能调优的繁杂细节之前, 我想先列举一下SQL Server如何执行一个查询(query)的结构, 这部分内容非常重要, 因为了解这些概念, 对我们以后的性能调优课程会理解的更加深刻. 下面的图为我们展示了SQL Server执行查询过程中所包含的几个主要组成部分: SQL S

第1周 SQL Server 如何执行一个查询。

大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要,因为接下来的培训中我们会以这些概念来加深我们对SQL Server的认识. 当我们执行一个查询时,在SQL Server中最重要的组件有哪些,下面这张图片可以给大家一个概观的认识. 可以看到,SQL Server内部分成了2个部分:关系引擎和存储引擎.在关系引擎中最大的一个组件是查询优化器.查询优化

SQL Server中执行Sql字符串,返回执行结果

今天遇到一个问题:想把sql字符串在SQL Server 中执行了,并获取执行的结果 DECLARE @tablename NVARCHAR(300); SET @tablename='select @table3 = count(1) from UserVisitLog'; DECLARE @newtablename NVARCHAR(300); exec sp_executesql @tablename, N'@table3 NVARCHAR(300) OUT',@newtablename

【MS SQL】通过执行计划来分析SQL性能

如何知道一句SQL语句的执行效率呢,只知道下面3种: 1.通过SQL语句执行时磁盘的活动量(IO)信息来分析:SET STATISTICS IO ON (开启) / SET STATISTICS IO OFF (关闭) 2.通过SQL语句执行时语法分析.编译以及执行所消耗的时间:SET STATISTICS TIME ON (开启) / SET STATISTICS TIME OFF (关闭) 3.通过执行计划查看:Ctrl + L -------------------------------

第六篇 SQL Server安全执行上下文和代码签名

本篇文章是SQL Server安全系列的第六篇,详细内容请参考原文. SQL Server决定主体是否有必要的执行代码权限的根本途径是其执行上下文规则.这一切都可能复杂一个主体有执行代码的权限,但是却没有访问代码中基础对象的权限,比如表中的数据.这一篇将探讨SQL Server的执行上下文.所有权链接和模拟,以及告诉你如何通过T-SQL代码控制访问数据.执行上下文当用户执行一个存储过程或其他数据库代码,SQL Server检查以确保用户不但有执行过程权限,而且有代码访问的数据库对象的权限.如果没