设为首页 收藏本站
查看: 848|回复: 0

[经验分享] Sql Server之旅——第十一站 简单说说sqlserver的执行计划

[复制链接]

尚未签到

发表于 2015-6-29 16:45:29 | 显示全部楼层 |阅读模式
  我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样
  就可以方便的找到sql的缺陷和优化点。
  一:执行计划生成过程
  说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图:
DSC0000.png
  1. 分析过程
  这三个比较容易理解,首先我们要保证sql的语法不能错误,select和join的表是必须存在的,以及你是有执行这个sql的权限,对不对。。。
  这样我们就走完了执行计划生命周期的第一个流程。
  2. 编译过程
  保证了上面sql这三点的话,引擎就必须硬着头皮看你这么一大坨烂sql,该删的删,该改的改,该转换的转换,比如说你的“子查询”会转化为
  “表连接”等等。。。其实也挺难为引擎的,举个例子吧。
  子查询生成的sql:
DSC0001.png
  join生成的sql:
DSC0002.png
  
  从上面的两个结果中,你可以看到,大家都是玩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
DSC0003.png
  从图中你看到了两个adhoc(即时查询),分别是我在第一步执行的join查询和我在第二步执行的这个select。
  
  3. 现在我们已经拿到了2个adhoc的plan_handle,然后通过dm_exec_sql_text查看他们的sql分别是怎样?
DSC0004.png
  4. 看完text缓存,接下来我们继续看看sql的plan缓存在哪?可以通过dm_exec_query_plan来查看。
DSC0005.png
  上面的query_plan字段就是所谓的执行计划,以xml的形式保存在字段中。。。所以说解析这个xml还是很费时间的。。。


DSC0006.gif DSC0007.gif


  1
  2
  3     
  4         
  5            
  6                 
10                     
11                     
12                        
13                             
14                                 
15                                    
16                                         
17                                    
18                                 
19                             
20                             
21                                 
22                                    
23                                         
24                                    
25                                 
26                             
27                        
28                        
29                             
30                                 
31                                 
32                                 
33                             
34                             
35                                 
36                                    
37                                         
38                                         
39                                         
40                                    
41                                    
42                                         
43                                             
44                                                
45                                             
46                                             
47                                                
48                                             
49                                             
50                                                
51                                             
52                                         
53                                         
54                                         
55                                             
56                                                
57                                                     
58                                                         
59                                                            
60                                                         
61                                                         
62                                                            
63                                                                 
64                                                            
65                                                         
66                                                     
67                                                
68                                             
69                                         
70                                    
71                                 
72                                 
73                                    
74                                    
75                                         
76                                         
77                                         
78                                             
79                                                
80                                                     
81                                                         
82                                                            
83                                                         
84                                                     
85                                                     
86                                                         
87                                                     
88                                                
89                                             
90                                         
91                                    
92                                 
93                             
94                        
95                     
96                 
97            
98         
99     
100
View Code  
  好了,到现在你应该认识到重新生成执行计划是不容易的。。。下一篇我们讨论讨论重用,重编译,重新生成等相关情况。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81649-1-1.html 上篇帖子: SQL Server Analysis Service 下篇帖子: SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表