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

news2024/11/25 5:00:00

往期内容:

(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! 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win11安装docker运行Open-Webui 界面化展示 ollama大模型

1.OpenWeb UI运行需要docker 环境下载docker Get Started | Docker 2.需要命令提示符docker -v 查询是否安装成功; 查询docker详情docker version 3.github拉取open-webUi镜像Package open-webui GitHub 复制命令运行在命令提示符; 等待下载完成 4.到…

[图解]SysML和EA建模住宅安全系统-07 to be块定义图

1 00:00:01,970 --> 00:00:05,040 入侵者这里有个∞ 2 00:00:05,530 --> 00:00:07,000 说明它下面已经有子图了 3 00:00:07,010 --> 00:00:08,080 我们看看里面子图 4 00:00:10,200 --> 00:00:17,000 这里,我们看位置 5 00:00:19,030 --> 00:00:…

find 几招在 Linux 中高效地查找目录

1. 介绍 在 Linux 操作系统中,查找目录是一项常见的任务。无论是系统管理员还是普通用户,都可能需要查找特定的目录以执行各种操作,如导航文件系统、备份数据、删除文件等。Linux 提供了多种命令和工具来帮助我们在文件系统中快速找到目标目…

MyBatis-Plus介绍及Spring Boot 3集成指南

我们每个Java开发者都在使用springbootmybatis开发时,我们经常发现自己需要为每张数据库表单独编写XML文件,并且为每个表都需要编写一套增删改查的方法,较为繁琐。为了解决这一问题,MyBatis-Plus应运而生。在本文中,我…

http协议报文头部结构解释

http协议报文头部结构 请求报文 报文解释 请求报文由三部分组成:开始行、首部行、实体主体 开始行:请求方法(get、post)url版本 CRLE 方法描述GET请求指定页面信息,并返回实体主体HEAD类似get要求,只不…

【论文阅读】Rank-DETR(NIPS‘23)

paper:https://arxiv.org/abs/2310.08854 code:https://github.com/LeapLabTHU/Rank-DETR

图片、视频画质增强变清晰工具分享(免费)

生活中可能会修一下模糊图片那么这就有一款用来修图片的管理工具,也有可能会修一下模糊的视频,在吾爱上有大佬开发了这么一款工具,免费的,不需要开任何VIP,我试了一下,好用,分享出来&#xff0c…

redis核心面试题一(架构原理+RDB+AOF)

文章目录 0. redis与mysql区别1. redis是单线程架构还是多线程架构2. redis单线程为什么这么快3. redis过期key删除策略4. redis主从复制架构原理5. redis哨兵模式架构原理6. redis高可用集群架构原理7. redis持久化之RDB8. redis持久化之AOF9. redis持久化之混合持久化 0. red…

Kubernetes——资源调度与Pod探针

目录 前言 一、资源调度策略 1.默认调度器(Default Scheduler) 2.自定义调度器(Custom Scheduler) 3.亲和性与反亲和性(Affinity and Anti-Affinity) 4.污点与容忍(Taints and Toleration…

达梦数据库使用dmlcvt命令找回更改前的数据

在生产系统上不小心修改了表数据后最快的方法是用闪回查询找回。但时间不能超过undo_retention(默认90秒)。其实最标准的处理方法是在其他机器上将数据库恢复到修改前的时刻。但数据库比较大时恢复时间较长。真实场景可能比较急。那么也可以分析归档日志…

DotNetty ByteBuffer

DotNetty是一个高性能的.NET网络通信框架,基于Netty,支持TCP、UDP、HTTP、WebSocket等协议。适用于高并发、低延迟场景,如实时通信、游戏服务器、IoT应用及大型分布式系统,通过异步I/O、零拷贝等技术提升性能,具备易用…

eNSP小练习一枚

问答看到的,随便敲了敲,希望各路大佬不吝赐教~ 话说现在的问答全是ai,乌烟瘴气的 首先配置全互通,ip vlan 端口隔离 ospf啥的 SWA # vlan batch 10 20 30 99 # interface Vlanif1ip address 10.1.1.2 255.255.255.0 # interf…

【ETAS CP AUTOSAR工具链】ARXML文件详解

本篇文章首先对ARXML这种文件格式做了一个概述,叙述了这种标签语言的基本语法(如果您用HTML做过网页,那么这种格式您一定不会陌生),然后对ARXML文件都会包含的一些基本信息做了详细的解读,最后基于使用ISOL…

[数据集][目标检测]吸烟检测数据集VOC+YOLO格式1449张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1449 标注数量(xml文件个数):1449 标注数量(txt文件个数):1449 标注…

鸿蒙开发配置官方地图

一共需要配置 p12 p7b cer csr 四个文件 p12文件配置 注意创建文件名必须是.p12 到AGC创建项目 AppGallery Connect 添加自己的项目名称 我没有开启 暂时不需要 看个人需求 下载刚创建的cer证书 回到我的项目中 点击刚创建的项目 点击这里 四个文件齐全了 "metadata&qu…

近临算法(个人总结版)

背景 近邻算法(Nearest Neighbor Algorithm)是一种基本但非常有效的分类和回归方法。最早由Fix和Hodges在1951年提出,经过几十年的发展和改进,已成为数据挖掘、模式识别和机器学习领域的重要工具。近邻算法基于相似性原则&#x…

DVWA登录页面空白问题解决

问题: 创建完成后打开登录页面,发现打不开,一片空白 解决: php版本不对,更换版本即可

VueHooks Plus:Vue 3 Hooks 的全面解决方案

VueHooks Plus:Vue 3 Hooks 的全面解决方案 文章目录 VueHooks Plus:Vue 3 Hooks 的全面解决方案〇、元信息一、概述快速开始TypeScript 支持交互式 Demo 演示服务器端渲染(SSR)支持基于插件模式的请求函数按需加载安全性和测试 二…

PHP生成二维码+二维码包含logo图片展示

composer require chillerlan/php-qrcode 用到的扩展自己安装(注:只生成二维码只要开gd扩展就行) 仅生成二维码看这个: use chillerlan\QRCode\QRCode;public function QRCode(){$qrcode new QRCode();$url "http://ww…

如何利用51建模网,实现3D模型线上展示和应用?

按照下面的步骤,在51建模网上传3D模型,并编辑完成后,接下来就是如何让这些3D模型得到更好的展示、传播和应用。 一、3D内容快速分享与传播 3D模型在51建模网上传发布后,即可获得一个可分享的链接和二维码,直接分享给客…