我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点。

一:执行计划生成过程

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

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到底在哪,并且长的是个什么样子。

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还是很费时间的。。。

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

Sql Server之旅——第十站 简单说说sqlserver的执行计划相关推荐

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

    原文:Sql Server之旅--第十一站 简单说说sqlserver的执行计划 我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么 ...

  2. Sql Server之旅——第十二站 sqltext的参数化处理

    Sql Server之旅--第十二站 sqltext的参数化处理 原文:Sql Server之旅--第十二站 sqltext的参数化处理 说到sql的参数化处理,我也是醉了,因为sql引擎真的是一个无 ...

  3. Sql Server之旅——第五站 确实不得不说的DBCC命令

    Sql Server之旅--第五站 确实不得不说的DBCC命令 原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干 ...

  4. Sql Server之旅——第四站 你必须知道的非聚集索引扫描

    非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了...这时候就有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划一 ...

  5. Sql Server之旅——第六站 为什么都说状态少的字段不能建索引

    我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道,或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说. ...

  6. Sql Server之旅——第十四站 深入的探讨锁机制

    上一篇我只是做了一个堆表让大家初步的认识到锁的痉挛状态,但是在现实世界上并没有这么简单的事情,起码我的表不会没有索引对吧,,,还 有就是我的表一定会有很多的连接过来,10:1的读写,很多码农可能都会遇 ...

  7. Sql Server之旅——第十二站 对锁的初步认识

    作为一个开发人员,锁机制也是我们程序员必须掌握的东西,很久之前在学习锁的时候,都是教科书上怎么说,然后我怎么背,缺少一个工具让我们眼见为实...如果这样的话,学习一个东西就很容易忘记...因为这些都是 ...

  8. Sql Server之旅——第十三站 深入的探讨锁机制

    上一篇我只是做了一个堆表让大家初步的认识到锁的痉挛状态,但是在现实世界上并没有这么简单的事情,起码我的表不会没有索引对吧,还有就是我的表一定会有很多的连接过来,10:1的读写,很多码农可能都会遇到类似 ...

  9. Sql Server之旅——第八站 看公司这些DBA们设计的这些复合索引

    这一篇再说下索引的最后一个主题,索引覆盖,当然学习比较好的捷径是看看那些大师们设计的索引,看从中能提取些什么营养的东西,下面我们看看数据库中一个核心的Orders表. 一:查看表的架构 1. 先查看这 ...

最新文章

  1. unix实际用户ID和有效用户ID解析
  2. Linux C函数库参考手册
  3. Java如何判断今天本月第几周的周几?
  4. SpringBoot中自定义消息转化器
  5. vant 动态 粘性布局_CSS Viewport 单位,很多人还不知道使用它来快速布局!
  6. Pytorch中的 torch.Tensor() 和 torch.tensor() 的区别
  7. 一些jquery的使用方法
  8. linux下运行程序后出现段错误的原因和解决案例
  9. 13 岁编程!少年比尔·盖茨如何成为最成功的自学成才程序员?
  10. fortigate的RADIUS域用户的组认证为SSL×××用户(上)
  11. 新特性:英特尔® 线程构建模块 4.2
  12. python 图像识别男女_python实现图像识别功能
  13. python 网络音乐播放器(二):tkinter 实现歌词同步滚动
  14. Python数据分析实战(1)数据分析概述
  15. 数据结构刘畅c语言版课后答案,数据结构习题集答案--清华大学版
  16. 40岁后吃不胖的秘诀 济阳高穗饮食理论
  17. 北航计算机考博经验,北航考博经验总结和感受
  18. λ-矩阵(矩阵相似的条件)
  19. cf1527 c Sequence Pair Weight
  20. PS新手教程:加深减淡工具使用方法

热门文章

  1. mysql 日期时间类型 自动转型 及 运算
  2. 十六、Struts2文件上传与下载
  3. 通俗理解T检验与F检验的区别【转】
  4. 带有控制按钮的图片滚动
  5. 【转】Asp.Net中Excel操作权限的问题
  6. 惠普m1005连接电脑步骤_电脑连接电视机详细步骤方法图文
  7. windows运行对话框_如何在Windows运行对话框中添加文本快捷方式?
  8. css段落缩进_如何缩进Google文档中的段落
  9. php旧版本windows_Windows的旧版本中如何进行多任务处理?
  10. E-MapReduce上如何升级EMR-Core