(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.pswp.cn/diannao/13913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13913.shtml
英文地址,請注明出處:http://en.pswp.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 中的 FormField 小部件:全面指南

Flutter 中的 FormField 小部件:全面指南 在Flutter的世界里,表單是用戶輸入數據的基本方式之一。FormField是一個強大的小部件,它將表單字段的創建、驗證和管理集成到了一個易于使用的抽象中。本文將為您提供一個全面的指南,幫助…

AWS安全性身份和合規性之AWS Firewall Manager

AWS Firewall Manager是一項安全管理服務,可讓您在AWS Organizations中跨賬戶和應用程序集中配置和管理防火墻規則。在創建新應用程序時,您可以借助Firewall Manager實施一套通用的安全規則,更輕松地讓新應用程序和資源從一開始就達到合規要求…

【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

大模型日報2024-05-23

大模型日報 2024-05-23 大模型資訊 減少生成型AI和大型語言模型中的幻覺現象 摘要: Phocuswright即將發布全面報告《從流行詞到實際效益:跟上旅游業中生成型AI的步伐》。該報告預覽指出,降低生成型人工智能及大型語言模型在生成內容時出現的幻覺現象是行…

git二次上傳文件夾、文件

主要記錄自己遇到的問題。 一、報錯error:failed to push somes ref to..... 報錯:error the following untracked working tree files would be overwritten bt merge... 把報錯的(重復的文件刪除) git init git add -f 文件夾/文件名…

vue 使用iView組件中的Table實現定時自動滾動

封裝Table 要在css中設置table的高度&#xff0c;使數據過多時出現滾動條&#xff0c;將縱向設置為overflow-y: auto;橫向設置隱藏 overflow-x: hidden; <template><div class"table_container"><Table :loading"tableLoading" :columns&qu…

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;數據都是由后端實現的&…

kotlin基礎之空指針檢查、字符串表達式、函數默認值

Kotlin 的空指針檢查 Kotlin 是一種空安全的語言&#xff0c;這意味著它強制開發者明確地處理可能的空值。在 Kotlin 中&#xff0c;所有的變量默認都是非空的&#xff0c;除非顯式地標記為可為空。 聲明可為空的變量 你可以通過在類型后面添加 ? 來聲明一個變量可以為空&a…

基于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方法為常見場景提供了模…

[C++] 小游戲 能量 1.0.0 版本 zty出品

大家好&#xff0c;也是停更了一段時間&#xff0c;這段時間我去學習了&#xff08;其實是摸魚&#xff09;&#xff0c;今天帶來一個新游戲《能量》&#xff0c;規則為&#xff1a;使用能量技能來增加能量&#xff0c;消耗能量使用攻擊技能來攻擊對方&#xff0c;有三個攻擊技…

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…