sqlserver的执行计划

一:执行计划生成过程

  说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图:

1. 分析过程

  这三个比较容易理解,首先我们要保证sql的语法不能错误,select和join的表是必须存在的,以及你是有执行这个sql的权限,对不对。。。

这样我们就走完了执行计划生命周期的第一个流程。

2. 编译过程

保证了上面sql这三点的话,引擎就必须硬着头皮看你这么一大坨烂sql,该删的删,该改的改,该转换的转换,比如说你的“子查询”会转化为

“表连接”等等。。。其实也挺难为引擎的,举个例子吧。

<1>子查询生成的sql:

<2>join生成的sql:

从上面的两个结果中,你可以看到,大家都是玩join的,如果你仔细看的话,会发现一个是“哈希匹配”,一个是“嵌套循环”,为什么不一样,这

当然是引擎根据很多情况综合评选出来的,比如说:磁盘IO,逻辑读,资源占用,硬件环境等等。。。这也是所谓的“计划选优”操作。

3.执行过程

  既然执行计划都选出来了,理所当然就要执行了,执行完后会把sql和执行计划放入缓存,这样下次有同样的sql过来的时候就可以直接从

Cache中提取了,不需要再次生成计划了,你也看到,生成执行计划还是比较消耗CPU时间的。

二:看看sql和执行的计划的缓存

  刚才也说了,sql和plan都已经放入缓存了,那我的好奇心比较强,我就想看看sql和plan到底在哪,并且长的是个什么丑样子,刚好

sqlserver还是比较能够满足我们G点的。

1. 为了方便查看缓存,我需要先将所有的缓存清空,比如下面的语句。

DBCC freeproccache
SELECT c.* FROM dbo.Category AS c
JOIN dbo.Product AS p
ON c.CategoryId=p.CategoryId
WHERE c.CategoryId=23794

2. 通过sys.dm_exec_cached_plans拿到sql和plan的指针(plan_handle),如下图

SELECT * FROM sys.dm_exec_cached_plans

从图中你看到了两个adhoc(即时查询),分别是我在第一步执行的join查询和我在第二步执行的这个select。

3. 现在我们已经拿到了2个adhoc的plan_handle,然后通过dm_exec_sql_text查看他们的sql分别是怎样?

4. 看完text缓存,接下来我们继续看看sql的plan缓存在哪?可以通过dm_exec_query_plan来查看。

上面的query_plan字段就是所谓的执行计划,以xml的形式保存在字段中。。。所以说解析这个xml还是很费时间的。。。

  1 <?xml version="1.0"?>
  2 <ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.0.1600.22">
  3     <BatchSequence>
  4         <Batch>
  5             <Statements>
  6                 <StmtSimple StatementText="SELECT c.* FROM dbo.Category AS c
  7  JOIN dbo.Product AS p
  8  ON c.CategoryId=p.CategoryId
  9  WHERE c.CategoryId=23794" StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="1.33278" StatementEstRows="1.03803" StatementOptmLevel="FULL" QueryHash="0xB10B821B9B5E6396" QueryPlanHash="0x8C7B3B1660E28D16">
 10                     <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" />
 11                     <QueryPlan CachedPlanSize="16" CompileTime="2" CompileCPU="2" CompileMemory="168">
 12                         <MissingIndexes>
 13                             <MissingIndexGroup Impact="99.4633">
 14                                 <MissingIndex Database="[MYPETSHOP]" Schema="[dbo]" Table="[Product]">
 15                                     <ColumnGroup Usage="EQUALITY">
 16                                         <Column Name="[CategoryId]" ColumnId="2" />
 17                                     </ColumnGroup>
 18                                 </MissingIndex>
 19                             </MissingIndexGroup>
 20                             <MissingIndexGroup Impact="99.4636">
 21                                 <MissingIndex Database="[MYPETSHOP]" Schema="[dbo]" Table="[Product]">
 22                                     <ColumnGroup Usage="EQUALITY">
 23                                         <Column Name="[CategoryId]" ColumnId="2" />
 24                                     </ColumnGroup>
 25                                 </MissingIndex>
 26                             </MissingIndexGroup>
 27                         </MissingIndexes>
 28                         <RelOp NodeId="0" PhysicalOp="Nested Loops" LogicalOp="Inner Join" EstimateRows="1.03803" EstimateIO="0" EstimateCPU="4.33898e-006" AvgRowSize="97" EstimatedTotalSubtreeCost="1.33278" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
 29                             <OutputList>
 30                                 <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="CategoryId" />
 31                                 <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="Name" />
 32                                 <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="Image" />
 33                             </OutputList>
 34                             <NestedLoops Optimized="0">
 35                                 <RelOp NodeId="1" PhysicalOp="Clustered Index Seek" LogicalOp="Clustered Index Seek" EstimateRows="1" EstimateIO="0.003125" EstimateCPU="0.0001581" AvgRowSize="97" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="1.00001e+006" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
 36                                     <OutputList>
 37                                         <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="CategoryId" />
 38                                         <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="Name" />
 39                                         <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="Image" />
 40                                     </OutputList>
 41                                     <IndexScan Ordered="1" ScanDirection="FORWARD" ForcedIndex="0" ForceSeek="0" NoExpandHint="0">
 42                                         <DefinedValues>
 43                                             <DefinedValue>
 44                                                 <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="CategoryId" />
 45                                             </DefinedValue>
 46                                             <DefinedValue>
 47                                                 <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="Name" />
 48                                             </DefinedValue>
 49                                             <DefinedValue>
 50                                                 <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="Image" />
 51                                             </DefinedValue>
 52                                         </DefinedValues>
 53                                         <Object Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Index="[PK_Category]" Alias="[c]" IndexKind="Clustered" />
 54                                         <SeekPredicates>
 55                                             <SeekPredicateNew>
 56                                                 <SeekKeys>
 57                                                     <Prefix ScanType="EQ">
 58                                                         <RangeColumns>
 59                                                             <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Category]" Alias="[c]" Column="CategoryId" />
 60                                                         </RangeColumns>
 61                                                         <RangeExpressions>
 62                                                             <ScalarOperator ScalarString="(23794)">
 63                                                                 <Const ConstValue="(23794)" />
 64                                                             </ScalarOperator>
 65                                                         </RangeExpressions>
 66                                                     </Prefix>
 67                                                 </SeekKeys>
 68                                             </SeekPredicateNew>
 69                                         </SeekPredicates>
 70                                     </IndexScan>
 71                                 </RelOp>
 72                                 <RelOp NodeId="2" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="1.03803" EstimateIO="1.18831" EstimateCPU="0.0983419" AvgRowSize="11" EstimatedTotalSubtreeCost="1.28665" TableCardinality="89259" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
 73                                     <OutputList />
 74                                     <IndexScan Ordered="0" ForcedIndex="0" NoExpandHint="0">
 75                                         <DefinedValues />
 76                                         <Object Database="[MYPETSHOP]" Schema="[dbo]" Table="[Product]" Index="[PK_Product]" Alias="[p]" IndexKind="Clustered" />
 77                                         <Predicate>
 78                                             <ScalarOperator ScalarString="[MYPETSHOP].[dbo].[Product].[CategoryId] as [p].[CategoryId]=(23794)">
 79                                                 <Compare CompareOp="EQ">
 80                                                     <ScalarOperator>
 81                                                         <Identifier>
 82                                                             <ColumnReference Database="[MYPETSHOP]" Schema="[dbo]" Table="[Product]" Alias="[p]" Column="CategoryId" />
 83                                                         </Identifier>
 84                                                     </ScalarOperator>
 85                                                     <ScalarOperator>
 86                                                         <Const ConstValue="(23794)" />
 87                                                     </ScalarOperator>
 88                                                 </Compare>
 89                                             </ScalarOperator>
 90                                         </Predicate>
 91                                     </IndexScan>
 92                                 </RelOp>
 93                             </NestedLoops>
 94                         </RelOp>
 95                     </QueryPlan>
 96                 </StmtSimple>
 97             </Statements>
 98         </Batch>
 99     </BatchSequence>
100 </ShowPlanXML>

  好了,到现在你应该认识到重新生成执行计划是不容易的。。。下一篇我们讨论讨论重用,重编译,重新生成等相关情况。

时间: 2024-10-20 09:53:50

sqlserver的执行计划的相关文章

Sql Server之旅——第十一站 简单说说sqlserver的执行计划

原文:Sql Server之旅--第十一站 简单说说sqlserver的执行计划 我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点. 一:执行计划生成过程 说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图: 1. 分析过程 这三个比较容易理解,首先我们要保证sql的语法不能错误,select和join的表是必须存在的,以及你是有执行

SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为复用执行计划的性能比生成执行计划的性能要高很多,所以SqlServer的这一特性可以大大提高Sql语句的执行效率.特别是对于存储过程,因为存储过程的执行计划是在存储过程第一次执行的时候生成的,存储过程的执行计划生成后就会被缓存到SqlServer的执行计划列表中,如果以后存储过程再被执行,那么存储过

SQLServer中的执行计划缓存由于长时间缓存对性能造成的干扰

本文出处:http://www.cnblogs.com/wy123/p/7190785.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 先抛出一个性能问题,前几天遇到一个生产环境性能极其低下的存储过程,开发人员根据具体的业务逻辑和返回的数据量,猜测到这个存储过程的执行应该不会有这么慢.当时意识到可能是执行计划缓存的问题,因为当前这个存储过程的写法还是比较遵守参数化SQL的规范的(如果是动态即席查询SQL就不

SQLServer执行计划生成方式

说一点关于SQLServer 执行计划相关的东西吧,首先我不是DBA,这几年也做了一些关于SQL优化的东西,有一点自己理解的东西,说的不一定正确. 首先从应用程序传过来的T-SQL语句和存储过程的差异就是传过来的语句SQLServer会进行一次编译,而存储过程则是编译好的,执行时无需再次编译,等于就是一次编译多次执行,而传过来的SQL语句如果不是参数化查询的话不同的条件会生成不同的执行计划,举个栗子:SELECT * FROM dbo.Employee  WHERE ID = 1和 SELECT

sqlserver授予用户查看执行计划的权限

sqlserver查看语句的执行计划是非常重要的,可以提高开发人员代码的质量.所以有必要授予开发人员对数据库查看执行计划的权限. 查看执行计划的权限属于数据库一级别的权限,具体例子如下 use test:--选择需要授权的数据库 grant showplan to user;--授权给对应的用户

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

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

如何清除某条SQL的执行计划

如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法(除非alter system flush shared_pool),只能通过对表ddl使SQL硬解析.现在终于找到了,使用sys.dbms_shared_pool.purge 在11g下可以直接使用,但在10g上需要 alter session set events '5614566 trace name context forever'   --特定游标对象 S

MSSQLSERVER执行计划详解

序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博文给你:SqlServer性能检测和优化工具使用详细 ,sql语句的优化分析,T-sql语句查询执行顺序. 执行计划简介 1.什么是执行计划? 大哥提交的sql语句,数据库查询优化器,经过分析生成多个数据库可以识别的高效执行查询方式.然后优化器会在众多执行计划中找出一个资源使用最少,而不是最快的执行

了解Sql Server的执行计划

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