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

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

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

相关文章

Qt笔记:动态处理多个按钮点击事件以更新UI

问题描述 在开发Qt应用程序时,经常需要处理多个按钮的点击事件,并根据点击的按钮来更新用户界面(UI),如下图。例如,你可能有一个包含多个按钮的界面,每个按钮都与一个文本框和一个复选框相关联…

基于springboot+vue+Mysql的逍遥大药房管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

【flutter】 Running Gradle task ‘assembleDebug‘...超时问题

关联搜索:flutter下载gradle失败、AndroidStudio下载gradle失败 构建Flutter项目时遇到控制台一直卡在 Running Gradle task ‘assembleDebug’… 解决方案 1. 修改gradle-wrapper.properties 文件 如果找不到就直接搜索: 把https\://services.gradl…

vscode更改语言,记录一下

首先打开安装好的Vscode软件,可以看到页面上显示的是英文效果。 同时按键ctrlshiftp,接着在输入框中输入 configure Display language如图: 选择中文简体就ok了,如果没有则安装 chinese Language pack

vue3 ElementUI 日期禁选当日前, 当日后,几天后,几天前(例如3天后)

今日之前禁用 代码: ( 主要是 :disabledDate“disabledDateFun” ) <el-date-picker v-model"queryForm.selectedDate"type"date"range-separator"-"placeholder"选择日期":disabledDate"disabledDateFun" clearable /&…

前端面试:项目细节重难点问题分享

面试官提问&#xff1a;我现在给你出一个项目实际遇到的问题&#xff1a;由于后端比较忙&#xff0c;所以我们这边的列表数据排序需要前端最近实现&#xff0c;那你会怎么实现排序呢&#xff1f; 答&#xff1a;我的回答&#xff1a;确实&#xff0c;数据都是由后端实现的&…

基于MetaGPT构建单智能体

前言 在之前的文章中&#xff0c;我们详细地描述了Agent的概念和组成&#xff0c;在代码案例中体验了Agent的记忆、工具、规划决策模块&#xff0c;并通过几个Agent框架来加强读者对Agent开发设计与应用的理解&#xff0c;接下来我们就要进入智能体Agent的实际开发中&#xff0…

教师专属的成绩发布小程序

还在为成绩发布而烦恼&#xff1f;还在担心家长无法及时获得孩子的学习反馈&#xff1f;是否想要一个既安全又高效的工具来简化你的教学工作&#xff1f;那么&#xff0c;易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担&#xff0c;提高…

多式联运奇迹:探索 GPT-4o 的尖端功能

取得的显着进展的DigiOps与人工智能已经标志着重要的里程碑&#xff0c;随着时间的推移塑造了人工智能系统的能力。从早期基于规则系统的出现机器学习和深入学习&#xff0c;人工智能已经发展得更加先进和通用。 生成式预训练 Transformer (GPT) by OpenAI 已特别值得注意。每…

微服务远程调用 RestTemplate

Spring给我们提供了一个RestTemplate的API&#xff0c;可以方便的实现Http请求的发送。 同步客户端执行HTTP请求&#xff0c;在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模…

Algoriddim djay Pro Ai for Mac:AI引领,混音新篇章

当AI遇上音乐&#xff0c;会碰撞出怎样的火花&#xff1f;Algoriddim djay Pro Ai for Mac给出了答案。这款专业的DJ混音软件&#xff0c;以AI为引擎&#xff0c;引领我们进入混音的新篇章。 djay Pro Ai for Mac的智能混音功能&#xff0c;让每一位DJ都能感受到前所未有的创作…

计算机系统基础 7 分支程序的实现

简单条件转移指令 根据单个标志位的值&#xff08;CF&#xff0c; SF&#xff0c;OF&#xff0c;PF&#xff0c;ZF&#xff09;来确定是否转移&#xff0c; 如果条件成立&#xff0c;则&#xff08;EIP&#xff09; 位移量 ➡ EIP&#xff0c;否则什么也不做。 注意&#xff0…

深度学习500问——Chapter09:图像分割(4)

文章目录 9.10 Mask-RCNN 9.10.1 Mask-RCNN 的网络结构示意图 9.10.2 RCNN行人检测框架 9.10.3 Mask-RCNN 技术要点 9.11 CNN在基于弱监督学习的图像分割中的应用 9.11.1 Scribble 标记 9.11.2 图像级别标记 9.11.3 DeepLabbounding boximage-level labels 9.11.4 统一的框架 9…

作为 App 开发者会推荐安装的 Mac App

Xcode&#xff0c;作为 App 开发者&#xff0c;必须安装的工具。当然&#xff0c;有经验的开发者不会从 Mac App Store 下载&#xff0c;而是从网站下载&#xff0c;除了安装过程更可控&#xff0c;也方便多版本共存。此外&#xff0c;我不信任任何第三方下载方式&#xff1a; …

表面简单实则暗藏玄机的面试题:Java数组适合做队列吗?

Java数组本身是一种线性数据结构&#xff0c;它可以用来存储一系列固定大小的元素。尽管数组可以用于实现队列的一些基本操作&#xff0c;比如入队&#xff08;enqueue&#xff09;和出队&#xff08;dequeue&#xff09;&#xff0c;但由于其固定的大小&#xff0c;它并不适合…

开关电源重点可靠性测试项目与测试方法

为确保开关电源在复杂工作环境下的安全性与稳定性&#xff0c;各种安全性测试成为不可或缺的环节。本文将深入探讨几项关键的安全性测试项目&#xff0c;帮助用户全面了解如何评估开关电源的可靠性和安全性。 一、过压保护测试方法 目的是为了检测当输出电压过高时&#xff0c;…

项目9-网页聊天室2(登录)

0.前端知识储备 Ajax请求中的async:false/true的作用 - front-gl - 博客园 (cnblogs.com) 01.前端页面展示 02.后端代码 2.1 CONTROLLER RequestMapping("/login")public Result login(String username, String password, HttpSession httpSession){User user …

乡村振兴与农村社会治理现代化:加强农村社会治理体系和治理能力现代化建设,提升乡村治理效能,为美丽乡村建设提供坚实保障

一、引言 在全面推进乡村振兴的伟大实践中&#xff0c;农村社会治理现代化是不可或缺的重要一环。随着时代的发展&#xff0c;传统的农村社会治理方式已经无法满足现代社会发展的需求。因此&#xff0c;加强农村社会治理体系和治理能力现代化建设&#xff0c;提升乡村治理效能…

2024年电工杯数学建模竞赛思路资料汇总贴

下文包含&#xff1a;2024电工杯&#xff08;电工杯数学建模竞赛&#xff09;思路解析、电工杯参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛 C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料&#xff0c;帮助大家…

XSS漏洞

漏洞描述 XSS全名叫Cross Site Scripting(跨站脚本攻击)因为简写和css同名所以改名为XSS&#xff0c;该漏洞主要利用javascript可以控制html&#xff0c;css&#xff0c;浏览器的行为从而恶意利用&#xff0c;当开发人员未对输入的内容进行过滤或编码时&#xff0c;恶意用户在…