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

[经验分享] 查询处理和执行----查询计划

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-18 09:55:04 | 显示全部楼层 |阅读模式
查看查询计划的方式有如下几种:
1、上下文相关的菜单选项
SouthEast.jpg

2、set showplan_text on/off
SouthEast.jpg

3、set showplan_all on/off
SouthEast.jpg
4、set showplan_xml on/off
SouthEast.jpg SouthEast.jpg
5、set statistics profile on/off
SouthEast.jpg
6、 使用DMF
[sql] view plaincopyhttps://code.iyunv.com/assets/CODE_ico.pnghttps://code.iyunv.com/assets/ico_fork.svg

  • Select * From sys.dm_exec_query_plan(plan_handle)  
  • Select * From sys.dm_exec_text_query_plan(plan_handle)  

查询计划操作符
查询优化器可以使用多种不同的操作符来创建计划。这里将展示几个最常用的操作符。
Join操作符
Join操作符使SQL Server能够在两个表之间找到匹配的行。SQL Server有3种Join类型,它们处理来自两张表的行,对于自联接,输入可能是同一张表的不同行集。Nested loop有利于内部表有索引的小表;Merge join有利于有排序索引或输出需要排序的中等表;Hash join有利于中大型的表,对于并行计划表现不错,缩放好。
Nested Loop join会扫描一张表(外部表)的所有行,然后扫描另一张表(内部表)的每一行,如果行在内外表匹配,则该行就被包含在结果中。这种join的性能与每张表的行数成正比。通常行数少的表被选作内部表,行数多的用作外部表,如果两种表都有大量的行,那么join就会花费很长时间。
Merge join需要对输入分类,因此理想状况下,表应该对join列索引,然后操作符会同时迭代两种表的行,减少行,寻找匹配行。由于输入被排序,这使join能够迅速进行,一旦任何一个范围满足了就会停止。
Hash join操作分两个阶段。在第一阶段,被称为构建阶段(build phase),两种表中更小的那张表被扫描,并把行存到内存里的哈希表,但对于非常大的表,它可以写入磁盘。当每一行都被哈希了,第二阶段就开始了。第二阶段,被称为探索阶段(probe phase),两张表中更大的那张表的行被拿来和哈希表的内容比较,使用和构建阶段一样的哈希算法。任何匹配的行被传到输出。Has join能够处理非常大的表,在允许并行计划的多处理器系统上是个不错的选择。SQL Profiler事件在发生散列递归(hash recursion)或哈希释放(hash bailout)时会发出哈希警告。散列递归发生在哈希操作的输出不能完全装进内存。哈希释放发生在散列递归到达递归的最大水平,并且必须选择一个新计划。哈希警告是性能问题的潜在指标,其可能的解决方案是增加内存、确保join列上存在统计并且是最新的、强制使用不同类型的join。
Spool 操作符
Spool操作符用于创建来自输入流的行的临时副本,并把它们传送到输出流。Spool通常位于两个其他操作符之间,右边的是child,提供输入流;左边的操作符是parent,消耗输出流。下面列表为每个物理spool操作符提供简要的描述,这些是实际执行的操作符。你也可以参见逻辑操作符,其代表优化操作的更早阶段,在执行计划之前,这些操作符随后被转换为物理操作符。逻辑spool操作符是Eager Spool和Lazy Spool。
  • Index spool:读取child表中的行,放入tempdb,在继续之前在它们上面创建一个非聚集索引,这使得parent能够在基础表没有合适的索引时,利用这个非聚集索引搜索。
  • Row count spool:读取child表中的行,对行计数。这些行也会返回到parent,但没有任何数据,这使得parent能够确定是否存在行,来满足EXISTS或NOT EXISTS需求。
  • Table spool:读取child表中的行,写入tempdb。在parent开始处理行之前,child的所有行都被读到tempdb。
  • Window spool:这个运算符将每个行扩展为表示与行关联的窗口的行集。 它既是一个物理运算符,也是一个逻辑运算符。
Scan和Seek操作符
这两个操作符使SQL Server能够在需要较大量的行的时候,从表及索引中检索行。Scan操作符扫描表中所有行来寻找匹配的行。当匹配的行数超过表的20%,scan就开始胜过seek,因为seek有穿越索引到达每一行的额外成本。scan操作符变体有聚集索引扫描、非聚集索引扫描和表扫描。Seek操作符使用索引找到匹配的行。当查询仅需要相对小的行集时,seek比scan更快找到匹配的行;然而,当返回的行数超过表的20%时,seek的成本就会接近scan;当几乎需要整张表时,scan会比seek执行得快。seek操作符变体有聚集索引seek和非聚集索引seek。
Lookup操作符
Lookup操作符执行寻找单行数据的任务。常见的有:
  • Bookmark lookup:仅见于SQL Server2000及更早的版本。它是SQL Server使用聚集索引查找一行的方式。在SQL Server 2012,这一任务是Clustered Index Seek、RID lookup或Key Lookup完成的。
  • Key lookup:表有聚集索引返回单行。与堆(heap)相比,lookup是使用聚集键(key)实现的。SQL Server 2005 SP2添加了key lookup操作符。当前以text或XML格式查看计划时,这个操作符显示为带有关键字lookup的clustered index seek。
  • RID lookup:从一个堆里查找单行。RID引用内部唯一的行标识符,用于查找行。
阅读查询计划
各种形式的查询计划要从右下方开始阅读,到左上方。如下图所示,我们首先应该看的Index Scan,然后是Hash Match、Compute Scalar、Sort,最后是SELECT。
Center.jpg




运维网声明 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-22268-1-1.html 上篇帖子: 查询处理和执行----查询优化(2) 下篇帖子: 查询处理和执行----执行查询 计划
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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