查询优化器内核剖析第四篇:从一个实例看执行计划
系列文章索引:

查询优化器内核剖析第一篇
查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算
查询优化器内核剖析第三篇:查询的执行与计划的缓存 & Hint提示
查询优化器内核剖析第四篇:从一个实例看执行计划
 查询优化器内核剖析第五篇:进一步的了解执行计划

查询优化器内核剖析第七篇:执行引擎之数据访问操作---Scan

    这几天也收到了一些朋友的来信说:为什么你花这么多的时间将这些东西,直接告诉我性能优化的方法就行了。这个问题,其实早就说过了:学习查询优化器不是我们的目的,而是通过它,我们掌握SQL Server是如何处理我们的SQL的,掌握执行计划,掌握为什么产生I/O问题,为什么CPU使用老高,为什么你的索引加了不起作用…
    如果,我告诉你,你去加个索引,换SAN存储,这样意义不大!数据库优化就是这样的:没有所谓的“绝对手段,一下子把性能搞上去,一切都是看情况而定”,都是通过不断的分析,抽丝剥解。不带头脑的优化,能好到那里去?
     在前几篇文章中,我们已经谈了一些查询优化器的相关的基础介绍,也大致的了解了它到底是干什么的。查询优化器的结果就是产生执行计划,执行计划就是一个树,这个树由很多的物理操作组成,而这些物理操作就定义了如何去存储设备中去获取数据。
     我们可以以很多的不同的方式,例如图形化,文本,XML的形式来查看一个给定查询的实际的执行计划和估计的执行计划。这些不同格式的执行计划的区别主要在于包含的信息的详细程度不同。
      
    当需要查看一个查询的实际的执行计划的时候,这个查询比较要执行。然而,如果查看估计的执行计划,此时整个查询是不需要实际执行的。如果查询是个需要消耗很长时间,很多资源的查询,我们在分析问题的时候,会先查看这个查询估计的执行计划,并且这样做也不会对使用数据库的其他用户产生影响。
     查看实际执行计划和估计的执行计划方式有很多,最简单的方式就是在SQL Server管理界面点击如下按钮:
     查看估计的执行计划
查看实际的执行计划 :
    下面,我们就来通过一个简单的示例讲述执行计划,这里采用示例数据库:AdventureWorks。
     我们在SQL Server中输入以下查询:
    然后,点击“Include Actual Execution Plan”按钮,然后执行SQL语句,看到如下显示:
    在图中,我们可以看到一些物理操作符号以图标显示,例如Index Scan,Hash Aggregate。第一个图标称为结果操作符,它返回了查询的结果。
     
    每一个物理的操作符,其实就是存储引擎中实现的一些基本的操作或者方法。例如,一个逻辑的join(就是我们在SQL写的inner join之类的),可以再执行计划中以不同的物理join操作实现(Nested Loops Join, Merge Join, Hash Join)。当然,这里没有所谓的“那种物理操作好,哪种不好”,得看具体情况。
          
    每个物理操作执行的时候,就会去获取一些数据,然后将数据传递给它下一个物理操作,知道全部的操作完成,返回结果。在查看执行计划的时候,需要“从右向左,从下到上”进行。
在执行计划中,每个物理操作都有一些“箭头”相连,这些箭头就表明了执行的先后顺序,并且箭头的粗细也放映了传递数据的多少,越粗就表明数据越多。          
  
     我们可以通过把鼠标放在这些箭头上面,查看更多的信息。如下:
   通过查看提示信息,我们可以知道:Index Scan这个操作读取了19614条数据,这些数据之后被传递给了Hash  Aggregate操作。Hash  Aggregate执行之后,就将这些数据通过City字段做了一个distinct的处理,将575条数据给了下一个操作:
    对于执行计划中出现的一些物理操作,一般基本会通过三个方法来实现它们的功能(这里要把操作和方法的概念搞清楚,可能在很多的编程语言中,一个操作就是一个方法,或者说操作就是方法,这里的操作和方法和那些不同,一个操作是有几个方法来实现和完成的,为了便于理解,大家这里就把每一个操作理解为一个类吧):
               Open()方法:这个方法初始化一个物理操作
               GetRow()方法:这个方法每次都从它的上一个操作中获取一行数据
               Close()方法:执行完毕,做一些相关的清理等工作
              
    因为GetRow()方法每次只能从上一个操作中获取一个数据,那么如果上一个操作传递了很多的数据,那么这个物理操作就要多次调用上一个操作的GetRow()方。在上面的例子中,Hash  Aggregate操作只调用一次Index Scan的Open()方法,然后调用19615次Index Scan的GetRow()方法,最后调用一次Index Scan的Close()方法。
    其实我们还可以通过这个图形化的执行计划得到更多的信息!为了使得大家更好地消化今天的知识,余下的内容,下次接着讲述。

转载于:https://blog.51cto.com/yanyangtian/814688

查询优化器内核剖析第四篇:从一个实例看执行计划相关推荐

  1. 查询优化器内核剖析第一篇

    查询优化器内核剖析第一篇 查询优化器内核剖析第一篇 查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算 查询优化器内核剖析第三篇:查询的执行与计划的缓存 & Hint提示 查 ...

  2. JVM之GC(垃圾收集器)(第四篇)

    3.1 概念 GC 垃圾回收器是 JVM 中自动内存管理机制的具体实现,在 HotSpot 虚拟机中 GC 的工作主要划分为两 大类,分别是内存动态分配和垃圾回收,在内存执行分配之前,GC 首先会对内 ...

  3. Mysql高级调优篇——第二章:Explain执行计划深度剖析

    1.Mysql Query Optimizer 这个名称在前言部分我在Mysql的整体架构中介绍过,称为查询优化器:这个查询优化器在绝大多数的公司,是不会做任何修改和扩展的,因为业务不需要,大牛请不起 ...

  4. 第四篇 做一个用户登录之后查看学员信息的小例子

    需求: 1. 用户名: oldboy 密码: oldboy123 2. 用户登录成功之后跳转到列表页面 3. 失败有消息提示,重新登录 4.点击学生名称之后,可以看到学生的详细信息 后端: 1 fro ...

  5. mysql执行计划extra_四、MySQL优化之explain执行计划的extra属性

    explain之extra 包含不适合在其他列中显示但十分重要的额外信息 using filesort:文件排序 表明MySQL会对数据使用一个外部的索引排序, 而不是按照表内的索引顺序读取, mys ...

  6. 四、MySQL优化之explain执行计划的extra属性

    explain之extra 包含不适合在其他列中显示但十分重要的额外信息 using filesort:文件排序 表明MySQL会对数据使用一个外部的索引排序, 而不是按照表内的索引顺序读取, mys ...

  7. SQL Server调优系列进阶篇(查询优化器的运行方式)

    前言 前面我们的几篇文章介绍了一系列关于运算符的基础介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符. ...

  8. 如何阅读《数据库查询优化器的艺术:原理解析与SQL性能优化》

    附录B 如何阅读本书 本书是一本数据库内核相关书籍,从数据库的查询优化器入手,对数据库的查询优化引擎进行了分析和对比,对查询优化的技术做了全面的总结和剖析.从不同角度看,可能有着不同的感受:不同角色的 ...

  9. 支付宝工程师如何搞定关系数据库的“大脑”——查询优化器

    前言 查询优化器是关系数据库系统的核心模块,是数据库内核开发的重点和难点,也是衡量整个数据库系统成熟度的"试金石". 查询优化理论诞生距今已有四十来年,学术界和工业界其实已经形成了 ...

最新文章

  1. 剑指offer 28:字符串的排列
  2. hostapd中扫描的调用过程
  3. 随机森林和决策树区别_第六讲 决策树与随机森林
  4. STVD下配置Cosmic编译器
  5. 特殊方法,类之间的关系,分页
  6. 织梦标签把","逗号改成空格技巧
  7. 通过CentOS克隆虚拟机后发现无法启动网卡或无法上网的解决办法
  8. asp.net core 系列 17 通用主机 IHostBuilder
  9. Flink 的应用场景和架构模型
  10. Linux服务器上安装node.js
  11. ctypes 指针类型 byref pointer POINTER
  12. postman-批量导入数据
  13. Promise的作用及用法
  14. Excel如何打开两个独立窗口
  15. sql 开发html,uap开发sql
  16. 1970 matla 时间_教你用MATLAB做季节性调整
  17. vb.NET入门总结
  18. 关于CCleaner 卸载程序删除所有软件文件的现象
  19. jsp源码商城系统Myeclipse开发mysql数据库servlet开发java编程计算机网页项目
  20. DB2 DECODE函数

热门文章

  1. 深入理解c++中的函数模板
  2. c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)
  3. Ubuntu下QT的安装详细教程
  4. linux socket 编程(C语言)
  5. Linux网络编程服务器模型选择之循环服务器
  6. 关于对象的引用作为参数,可以直接访问私有成员的问题
  7. 1066 图像过滤 (15 分)
  8. Java线程相关的热门面试题
  9. Tensorflow笔记(基础): 图与会话,变量
  10. qt之旅-1纯手写Qt界面