(Oracle)SQL优化基础(三):看懂执行计划顺序

往期内容:

(Oracle)SQL优化基础(一):获取执行计划

(Oracle)SQL优化基础(二):统计信息


获取到执行计划后,对于新手朋友来讲可能不知道该从哪看起;这篇文章就旨在可以帮助大家先从看懂执行计划顺序开始。

目录

执行计划

基本知识必备

Ⅰ:父子兄弟节点

Ⅱ:深度 

​Ⅲ:position

​转化成树形结构

实战技巧


执行计划

有如下执行计划,该执行计划是通过 DISPLAY_CURSOR 方法获取的。后面所有的讲解都会围绕该执行计划进行,大家也可以自己先尝试进行排序。但首先要说明的是:Id列数字并不是执行计划的顺序号。

基本知识必备

Ⅰ:父子兄弟节点

Oracle的执行计划是树形结构,执行顺序有点类似于二叉树的逻辑。理解执行计划中的父节点、子节点、兄节点、弟节点就很重要。

  • 父节点与子节点

我们可以根据执行计划缩进来判断父子节点;如上图所示,可以看到一条红色箭头,下面用 Id 号来代替 Operation 步骤:

1 比 0 缩进一格,且0在上方;则1是0的子节点,0是1的父节点。

2 比 1 缩进一格,且1在上方;则2是1的子节点,1是2的父节点。

......

以此类推

......

10 比 9 缩进一格,且9在上方;则10是9的子节点,9是10的父节点。

10 比 11 缩进一格,且11在下方,10在上方;则10与11无父子关系。

也可以说10 与 11 无任何关系,唯一的关系就是在同一个树形结构上。

  • 兄节点与弟节点 

同样,根据执行计划的缩进来判断兄弟节点,如上图所示,可以看到 4 条红色箭头,下面用 Id 号来代替 Operation 步骤:

9 与 11 缩进相同,9在上,11在下;则9是兄节点,11是弟节点。

8 与 12 缩进相同,8在上,12在下;则8是兄节点,12是弟节点。

7 与 13 缩进相同,7在上,13在下;则7是兄节点,13是弟节点。

6 与 15 缩进相同,6在上,15在下;则6是兄节点,15是弟节点。

  • 可能会有疑问的地方 

担心看这篇文章的新手朋友可能会有疑惑:

为什么上面的14与8、12缩进相同,却不是兄弟节点呢?

这是因为13在14上方,14比13缩进一格,所以14是13的子节点,与8、12没有兄弟关系。 

Ⅱ:深度 

这里的深度就是上文提到的缩进,代表着执行计划某一个步骤的深度。上文为了容易理解用 “一格缩进” 来表示,但其实官方描述是深度。比方说上文的Id为5的步骤,相比于 Id为0的步骤有5个缩进,其深度就是5,也就代表着此步骤有5层父步骤(Id为4、3、2、1、0)。

总结来讲就是:执行计划的缩进层数代表了深度

可以通过下面的SQL查看执行计划步骤的具体深度值:

select
sp.id
sp.parent_id,
sp.depth,
sp.operation|| '' || sp.options as operation,
sp.object_name
from v$sql_plan sp
where sp.sql_id = 'xxxx'

结果如下,其中的depth列就是深度,id是执行计划中的id号,parent_id是父节点的id号。

 Ⅲ:position

position代表拥有相同父节点的兄弟节点处理顺序,在树形图中,树中每个级别最左端的叶节点最先执行。结合起来其实就在树形图中左为兄,右为弟;在执行计划列表中上为兄,下为弟

可以用下面的SQL查询执行计划步骤的position:

select
sp.id
sp.parent_id,
sp.depth,
sp.postion,
sp.operation|| '' || sp.options as operation,
sp.object_name
from v$sql_plan sp
where sp.sql_id = 'xxxx'

执行结果如下图所示,可以发现 Id 为9和11的步骤拥有相同的父节点8,深度相同,是兄弟节点;其中9的position值是1,11的position值是2,表示步骤9先于步骤11执行 。体现在树形结构中,9为左节点,11为右节点;体现在执行计划列表中即9在上,11在下(这点大家也可以在上面的执行计划图中看出来)。

这也可以得出来一个结论:兄先于弟执行,左先于右执行(同一层级)

 转化成树形结构

执行计划是按照树形结构的顺序执行的,将执行计划转化成树形结构更容易帮助理解执行计划顺序。如果您对数据结构很有研究,那么执行计划树形图对于您来讲就太简单了。如果您不熟悉,也没关系,请您认真看我下面的步骤。

Ⅰ:

前面我们已经知道了执行计划每个步骤的深度,其中最深的是10也就是执行计划的入口。

由前面的知识,我们知道10的父节点是9,9的弟节点是11,左为兄,右为弟。

而9与11的父节点是8。

所以此时树形图如下所示:

Ⅱ:

8与12是兄弟节点,8为兄,12是弟;兄在左,弟在右。

8与12的父节点是7.

所以此时的树形图如下所示:

Ⅲ:

7与13是兄弟节点,7为兄,13为弟;兄在左,弟在右。

7与13的父节点是6.

所以此时的树形图如下所示:

Ⅳ:

6与15是兄弟节点,6为兄,15为弟;兄在左,弟在右。

6与15的父节点是5.

且13是14的父节点。

所以此时的树形图如下所示:

Ⅴ:

0、1、2、3、4、5依次为后一位的父节点,且0是根节点。

所以最终的树形结构如下所示

【那啥,processon会员到期了,用的画图板,手残,大家将就着看吧,不好意思哈😅】

执行计划的树形结构

其实讲到这里可能已经有朋友将执行计划的执行顺序推测出来了。但我在这里还是讲下根据树形结构如何查看执行顺序:

  1. 从顶部开始
  2. 在树中向左下移动,直至到达左节点(没有子节点的节点);首先执行此节点。
  3. 查看此节点(首先执行节点)有无同级节点,也就是弟节点;有则执行弟节点
  4. 执行完这俩节点后,执行它俩的父节点。
  5. 完成此组父子节点后,在树中向上退一级,查看上退后这一组的父子节点,先左子节点后右子节点,最后父节点。
  6. 在树中不断上移,直至根节点。

以我们上面的树形结构为例:

1、从顶部开始,最左节点是10

2、查看此节点(首先执行节点)有无同级节点,也就是弟节点;有则执行弟节点
9有其同级弟节点11,继而执行11

3、执行完这俩节点后,执行它俩的父节点

执行完11后向上递归执行父节点8 

此时执行顺序是【10 -> 9 -> 11 -> 8】

3、完成此组父子节点后,在树中向上退一级,查看上退后这一组的父子节点,先左子节点后右子节点,最后父节点

按照上述的规律依次执行

但有一点需要提醒:

节点14是先于节点13执行的哦,因为14是13的子节点;如果某节点有子节点,则先执行子节点;如果有两个同级子节点,先执行左子节点。

此时的执行顺序是【10 -> 9 -> 11 -> 8 -> 12 -> 7 -> 14 -13 -> 6】

4、在树中不断上移,直至根节点

最终执行顺序是【10 -> 9 -> 11 -> 8 -> 12 -> 7 -> 14 -13 -> 6 -> 15 -> 5 -> 4 -> 3 -> 2 ->1 -> 0】

实战技巧

为了避免大家看到这里的时候,还得上翻执行计划,我把执行计划的图再放一次。

 在工作中进行SQL优化时,想查看执行计划顺序肯定不能还查下v$sql_plan里的父节点、深度、position等值,然后再画个树形图,这太二了。上面讲了那么多,是为了帮新手朋友理解执行计划顺序的背景,也只有理解好了才能更好更快的读懂执行计划。

那么实战中怎么看呢?我会利用截图工具,不用啥牛逼的截图工具,就QQ截图就挺好用的!

Ⅰ:利用截图工具的箭头找到执行计划入口,也就是执行顺序第一步。

从Id=0这一步开始,一直向下向右移动,直到找到没有子节点的步骤,就是执行计划的入口。

如下图:10就是入口。

Ⅱ:看下入口步骤有没有弟节点,再看弟节点有没有子节点

如果有弟节点,弟节点无子节点,那么第二步就是该弟节点。

如果有弟节点,弟节点有子节点,那么第二步就是从该弟节点开始用第Ⅰ步中箭头方式,找到它的没有子节点的节点。

像我们这个执行计划,入口没有弟节点。那么,就往上找它的父节点,即9,第二步执行9。

Ⅲ:把箭头拉长找对应的兄弟节点

找到执行计划的入口后,没有弟节点,就往上走(上为父)。然后记住我们前面的知识:先弟节点,弟节点执行完了,执行父节点。

且执行计划用肉眼直接去看兄弟节点,很容易看错的。所以可以借助截图工具中的箭头拉长,看两个步骤是否有相同的缩进。比对后相同缩进的步骤就是兄弟节点,上为兄,下为弟;兄先于弟执行。

对于我们这个例子而言,执行完9,通过箭头发现,11是它的弟节点,所以下一步执行11。

执行完11,执行9和11的父节点8,执行完8,通过箭头发现12是8的弟节点,所以下一步执行12。

以此类推!

就可以得出执行顺序了!

【10 -> 9 -> 11 -> 8 -> 12 -> 7 -> 14 -13 -> 6 -> 15 -> 5 -> 4 -> 3 -> 2 ->1 -> 0】

over! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/634892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

火箭升空AR虚拟三维仿真演示满足客户的多样化场景需求

在航空工业的协同研发领域,航空AR工业装配系统公司凭借前沿的AR增强现实技术,正引领一场革新。通过将虚拟信息无缝融入实际环境中,我们为工程师、设计师和技术专家提供了前所未有的共享和审查三维模型的能力,极大地提升了研发效率…

【华为】BFD与静态路由和RIP联用

【华为】BFD与静态路由和RIP联用 实验需求配置AR1AR2AR3AR4效果抓包查看 实验需求 如上图组网所示,在R1上配置到达R4的Loopback0。 4.4.4.4/32网段的浮动静态路由,正常情况下通过R3访问R4。 当R3故障时,自动选路通过R2访问R4的Loopback0;在R…

企业文件加密软件推荐:迅软DSE加密软件你用了吗?

一、挑选企业文件加密软件需考虑的因素? 1、安全性:软件应采用业界认可的强加密算法,以确保数据的安全性。 迅软特有的256位高强度加密算法,从根本上阻止一切破解的可能性。 2、易用性:软件应该易于部署和管理&…

如何停止 iPad 和 iPhone 之间共享短信,独立接收和发送消息

概括 在当今高度互联的数字世界中,Apple 设备之间的无缝连接性提供了极大的便利,尤其是在消息同步方面。iPhone 和 iPad 用户通常可以享受到设备间短信的自动同步功能,这意味着无论是在哪个设备上,用户都可以接收和回复消息。然而…

游戏联运的挑战与核心关键点

​游戏联运一个看似充满机遇与挑战的行业,吸引了很多创业者的加入。然而,真正踏入这个行业后,许多人会发现,手游代理并非想象中的那么简单。今天,溪谷软件就来和大家聊聊游戏联运是怎么做的,需要注意什么。…

react中的useEffect()的使用

useEffect()是react中的hook函数,作用是用于创建由渲染本身引起的操作,而不是事件的触发,比如Ajax请求,DOM的更改 首先useEffect()是个函数,接受两个参数,第一个参数是一个方法,第二个参数是数…

《计算机体系结构》期末考试复习笔记(一)试卷手写笔记(超重点)

一、MIPS 执行速率执行时间有效CPI【第1题】 二、Amdahl定律 - 性能加速比SP【第2题,第3题,第4题】 (百分比f 倍数r ) 三、哈夫曼编码 2-4扩展码【第5题】 四、互连函数【第9题】 就是每生成一个根节点, 就从小到大重新排…

后量子密码解决方案

什么是后量子密码学 (PQC),为什么准备工作如此重要? 量子计算正在迅速发展;用不了多久,量子网络攻击就会成为可能。量子网络攻击将能够在几分钟内瘫痪大型网络。我们今天赖以保护我们的连接和交易的一切都将受到量子计算机的威胁,危及所有密…

【618狂欢】五款必抢好物!爆款数码好物让你轻松get新潮流!

随着科技的飞速发展,数码产品已经成为我们生活中不可或缺的一部分。它们不仅为我们提供了便捷的生活体验,更成为了我们展示个性和追求潮流的重要载体。而在每年的618购物狂欢节,各大电商平台都会推出众多优惠活动,让我们有机会以更…

Linux——进程信号

目录 一、信号的理解 二、信号的种类 2.1 标准信号 (1-31) 2.2 实时信号 (通常是34及以上) 三、信号的产生 3.1 用户通过终端产生信号 3.1.1 signal 函数 3.1.2 demo 测试 3.1.3 demo 现象 3.2 通过系统函数产生信号 3.2.1 demo 测试 3.3 由软件条件产生信号 3.3.1…

访问列表元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,如果想将列表的内容输出也比较简单,可以直接使用print()函数即可。例如,创建一个名称为untitle的列表…

JAVA开发 基础Jaccard来计算两个字符串之间的重复率

计算两个字符串之间的重复率 Jaccard实现代码基于最长公共子序列来计算两个字符串之间的重复率 Jaccard Jaccard方法,也称为Jaccard相似度或Jaccard相似系数,是一种用于衡量两个集合相似程度的指标。其逻辑基于集合之间的交集与并集的关系来衡量它们的相…

Linux bc命令(bc指令)(基本计算器)(任意精度计算语言:支持浮点数运算、变量赋值和自定义函数等)

文章目录 bc命令文档英文中文 Linux bc 命令详解bc 命令的基本用法启动 bc 环境进行基本计算退出 bc bc 中的数学功能执行高级数学计算平方根和指数函数对数函数 处理精度问题 变量和数组变量赋值和使用数组的使用 创建和使用自定义函数 bc 命令的高级用法在脚本中使用 bc基本脚…

注解大全更新中~

Slf4j 是什么:Slf4j 是 Lombok 提供的一种注解,用于在类中自动生成一个名为 log 的日志对象。通过使用 Slf4j 注解,可以方便地在代码中使用日志功能,而无需手动创建和初始化日志对象。 怎么用: 1.导入依赖的包lombok…

uniapp移动端骨架屏流程

1.使用微信开发者工具来生成骨架屏;在分窗模式下选择页面信息,下拉选择生成骨架屏;他会基于当前页面生成骨架屏的样式 点击确定; 会自动生成这两个文件;一个是html结构文件,一个是css样式文件。 然后把这两…

R语言使用 ggscidca包优雅的绘制支持向量机决策曲线

DCA(Decision Curve Analysis)临床决策曲线是一种用于评价诊断模型诊断准确性的方法,在2006年由AndrewVickers博士创建,我们通常判断一个疾病喜欢使用ROC曲线的AUC值来判定模型的准确性,但ROC曲线通常是通过特异度和敏感度来评价,…

一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)

目录 ​编辑 引言 一、RDMA的基本原理 二、RDMA的主要特点 三、RDMA的编程接口 四、RDMA的代码演示 服务器端代码: 客户端代码: 五、总结 引言 RDMA,全称Remote Direct Memory Access,即远程直接内存访问,是…

Kafka-ACK机制(ack应答原理、冥等性、事务)

Kafka-ACK机制 Kafka中的ACK(Acknowledgement)机制是用于保证消息可靠传递的关键组件之一。在生产者发送消息到Kafka集群时,ACK机制决定了何时认为消息已经成功发送。这个机制非常重要,因为它影响了生产者对消息发送的信心以及消费…

fork 与 vfork 的区别

关键区别一: vfork 直接使用父进程存储空间,不拷贝。 关键区别二: vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。 我们可以定义一个cnt,在子进程中让它变成3, 如果使用fork,那…

uniapp中使用 iconfont字体

下载 iconfont 字体文件 打开 iconfont.css 文件,修改一下 把文件 复制到 static/iconfont/… 目录下 在App.vue中引入iconfont 5. 使用iconfont 使用 iconfont 有两种方式, 一种是 class 方式, 一种是使用 unicode 的方式 5.1 使用 class 的…