oracle 數據執行計劃,Oracle里常見的執行計劃

本文介紹了Oracle數據庫里常見的執行計劃,使用的Oracle數據庫版本為11.2.0.1。

1、與表訪問相關的執行計劃

Oracle數據庫里與表訪問有關的兩種方法:全表掃描和ROWID掃描。反映在執行計劃上,與全表掃描對應的執行計劃中的關鍵字是“TABLE ACCESS FULL”,與ROWID掃描對應的執行計劃中關鍵字是“TABLE ACCESS BY USER ROWID”或“TABLE ACCESS BY INDEX ROWID”。

50b1a9951f8c9e2592f82b64ba5dc363.png

9ff86e2975a4fd445cdcb7fec0dfca84.png

c659af7a10f2fa08e5185ab399009410.png

從實驗中可以看出,第一個SQL執行計劃走的是對表EMP的全表掃描,對應的關鍵字就是“TABLE ACCESS FULL”;第二個SQL的執行計劃走的是對表EMP的ROWID掃描,對應的關鍵字是“TABLE ACCESS BY USER ROWID”;第三個SQL的執行計劃走的是對表EMP的ROWID掃描,對應的關鍵字是“TABLE ACCESS BY INDEX ROWID”。注意如果ROWID來源于用戶手工指定則對應的是“TABLE ACCESS BY USER ROWID”;如果ROWID是來源于索引,則對應的是“TABLE ACCESS BY INDEX ROWID”。

2與B*Tree索引相關的執行計劃

Oracle數據庫里常見的與B*Tree索引訪問相關的方法,包括索引唯一掃描、索引范圍掃描、索引全掃描、索引快速全掃描和索引跳躍式掃描,反映在執行計劃上分別對應INDEX UNIQUE SCAN、INDEX RANGE SCAN、INDEX FULL SCAN、INDEX FAST FULL SCAN和INDEX SKIP SCAN。

用實驗查看相關執行計劃

014fac439e02bf384755550a3d112719.png

第一個SQL的執行計劃走的是對索引IDX_UNI_EMP的索引唯一掃描,關鍵字是“INDEX UNIQUE SCAN”。

d40af92b44d21b8c19d1903b5c039443.png

現在SQL的執行計劃是對索引IDX_EMP_1的索引范圍掃描,關鍵字是“INDEX RANGE SCAN”。

明明可以掃描索引IDX_EMP_1得到結果,卻選擇了全表掃描,就算使用Hint強制讓Oracle掃描索引IDX_EMP_1,結果卻是Hint失效了。

出現這個現象的原因是Oracle無論如何總會保證目標SQL結果的正確性,可能會得到錯誤結果的執行路徑Oracle是不會考慮的。對于索引IDX_EMP_1而言,它是一個單鍵值的B*Tree索引,所以NULL值不會存儲在其中,那么一量EMPLOYEE_ID出現了NULL值(雖然這里實際上并沒有NULL值),則掃描索引的結果就是漏掉那些EMPLOYEE_ID為NULL值的記錄,這也就意味著如果Oracle在執行上述SQL時選擇了掃描IDX_EMP_1,那么執行結果就有可能是不準的。在這種情況下,Oracle當然不會考慮掃描索引,即使我們使用了Hint。

如果想讓Oracle在執行上述SQL時掃描索引IDX_EMP_1,則必須將列EMPLOYEE_ID的屬性修改為NOT NULL。這就相當于告訴Oracle,這里列EMPLOYEE_ID上不會有NULL值,你就放心地掃描索引IDX_EMP_1吧。

從上面的輸出可以看出,現在SQL的執行計劃走的是對索引IDX_EMP_1的索引快速全掃描,對應的是“INDEX FAST FULL SCAN”。

現在加上強制走索引IDX_EMP_1的Hint,再次執行該SQL

可以看到現在SQL的執行計劃走的是對索引IDX_EMP_1的索引快速全掃描INDEX FULL SCAN(如果是在11.2.0.4版本上執行上以SQL可以以看到還是INDEX FAST FULL SCAN)

e3b04f7c14f70c18d3340340ddbed6b6.png

從上面輸出可以看出,SQL的執行計劃走的是對索引IDX_EMP_2的索引跳躍式掃描,對應“INDEXSKIP SCAN”。

3、與表連接相關的執行計劃

Oracle數據庫里常見的與表連接相關的一些方法:排序合并連接、嵌套循環連接、哈希連接等以及反連接和半連接

bfb33497c1695b161f287da5a54d0b7f.png

從上面的輸出可以看出,SQL的執行計劃走的是對表T1和T2的哈希連接,連接條件是t1.col2=t2.col2,對應的關鍵字是“HASH JOIN”。

使用強制走排序合并連接的Hint后再次執行SQL

a8bf28c72e080d94e0c04349a94b91fb.png

從上面的輸出可以看出現在SQL的執行計劃走的是對表T1和T2的排序合并連接,對應的關鍵字是“MERGEJOIN”和“SORT JOIN”。

接著使用強制走嵌套循環連接的Hint后再次執行SQL

fead269bc1fe02f20aba3aaa6be2c2c1.png

從上面的輸出可以看出現在SQL的執行計劃走的是對表T1和T2的嵌套循環連接,對應的關鍵字是“NESTEDLOOPS”

嵌套循環連接的驅動表是可以變的,我們使用Hint將上述SQL的驅動表改為T1再將執行SQL

c6ab919e442a4c9f8f6ec6c1a52839fe.png

從結果中可以看到,嵌套循環連接的驅動表確實已經變為T1

再看反連接的例子。首先將表T1和T2的連接列col2改為NOT NULL,以便能走出我們想要的反連接的執行計劃

a0fb8db1f1805c4412b50154fd678e00.png

從輸出內容上可以看出,SQL的執行計劃走的是對表T1和T2的哈希反連接,反連接在執行計劃中對應的關鍵字是“ANTI”,哈希反連接對應的就是“HASH JOIN ANTI”。

反連接的具體連接方法是可變的,這里使用Hint將SQL的反連接改為排序合并反連接

6432209729a16f0a52c91e53defec152.png

從輸出內容可以看出,SQL的執行計劃走的是對表T1和T2的排序合并反連接,對應的關鍵字是“MERGE JOIN ANTI”。

再使用Hint將SQL的反連接方法改為嵌套循環反連接

eaecc3f1a5d71334b473973170f12b72.png

再看半連接的例子。

0e012b270d626187af8f4bc8be1b2c74.png

從輸出可以看出,SQL的執行計劃走的是對表T1和T2的哈希半連接,半連接在執行計劃中對應的關鍵字是“SEMI”,哈希半連接在執行計劃中對應的關鍵字是“HASH JOIN SEMI”。

半連接的具體連接方法是可變的,使用Hint將SQL的半連接方法改為排序合并半連接:

78ca9bfed9a8d42ccddd1a6ab09e580b.png

從輸出內容可以看出,SQL的執行計劃走的是對表T1和T2的排序合并半連接,對應的關鍵字是“MERGE JOIN SEMI”。

再使用Hint把SQL的半連接方法改為嵌套循環半連接:

33bf8627fd71679098e0f3ff2880d5f2.png

從輸出內容可以看出,SQL的執行計劃走的是對表T1和T2的嵌套循環半連接,對應的關鍵字是“NESTED LOOPS SEMI”

4、關于位圖索引相關的執行計劃

Oracle數據庫里常見的與位圖索引訪問相關的方法包括如下這些類型:位圖索引單鍵值掃描、位圖索引范圍掃描、位圖索引全掃描、位圖索引快速全掃描、位圖按位與、位圖按位或、位圖按位減等。

Oracle在使用完位圖索引后通常會將最后的位圖運算結果轉化為ROWID,這一步轉換過程對應的執行計劃中的“BITMAP CONVERSION TO ROWIDS”。

21c97309155667ab023972ea1d34e21f.png從上面的輸出內容可以看出,SQL的執行計劃走的是對位圖索引IDX_B_REGION的位圖索引單鍵值掃描,對就的關鍵字是“BITMAP INDEX SINGLE VALUE”。

把SQL改寫為范圍查詢后再次執行

82ca1134102d717ea43b473f478be928.png從輸出內容可以看出SQL走的執行計劃是對位圖索引IDX_B_REGION的位圖索引范圍掃描,對應的關鍵字是“BITMAP INDEX RANGE SCAN”。

去掉where條件,并且只查詢位圖索引IDX_B_REGION的索引鍵值列:

4b3b96e4ecd739d9dddc0c31ffc465f0.png從輸出可以看出SQL走的執行計劃是對位圖索引IDX_B_REGION的位圖索引快速全掃描,對應的關鍵字是“BIT INDEX FAST FULL SCAN”。

執行如下SQL:

267f41357155f710cb9d126dcbb6c7b6.png

從輸出內容可以看出SQL走的執行計劃中,用到了位圖按位與操作,對應的關鍵字是“BITMAP AND”和位圖按位或操作,對應的關鍵字是“BITMAP OR”。

再構造位圖按位減的執行計劃,SQL如下:

24208122b10b3a3aeeef092f81967174.png從輸出的執行計劃中,位圖按位減的執行計劃對應的關鍵字是“BITMAP MINUX”。

0b1331709591d260c1c78e86d0c51c18.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282895.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282895.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET MAUI實戰 Dispatcher

詳細內容這一期分享的內容非常簡單,在之前使用過WPF的開發者對MVVM開發模式下ViewModel中后臺線程轉UI線程并不陌生使用Appplication.Current.Dispatcher。那么在.NET MAUI中也有同樣的機制,存在于.NET MAUI Shell對象中。那么什么是Shell?官…

GDB 配置

GDB 配置 使用 GDB 擴展來配置 GDB 事實上我還是覺得原生的 GDB 就挺好,速度快,需要查看什么執行命令就可以。 GDB DashBoard https://github.com/cyrus-and/gdb-dashboard $sudo mkdir -m 777 ~/gdbinit; cd ~/gdbinit $git clone https://github.com/c…

Oracle區分中文和英文,oracle中中英文段落劃分實現

oracle中關于中文占用字節數,不同的數據庫有不同的情況,有的占用兩個字節、有的占用三個字節,現在測試環境的數據庫中文占用三個字節,要實現由中英文組成的段落字符串,按照每行占用多少字節重新分段,具體應…

未來哪些行業值得加入?

閱讀本文大概需要5分鐘。這個問題很多讀者都問過,基本上每隔幾篇原創就會有人留言問,還有公眾號后臺和知乎私聊。之前在一次留言中我承諾專門開一篇文章來聊聊這個話題,今天想著要兌現這個諾言了。為啥最近會存在這個問題呢,原因其…

虛擬機網絡配置詳解(NAT、橋接、Hostonly)

VirtualBox中有四種網絡連接方式: NATBridged AdapterInternalHost-only AdapterVMWare中有三種,其實它跟VMWare的網絡連接方式都是一樣的概念,只是比VMWare多了Internal方式 在介紹四種工作模式之前,先說下虛擬網卡,虛擬機安裝好…

Oracle收款核銷了怎么撤銷,21應收收款-核銷取消或核銷調整

注:本課程不包含學習下載資料目標人群:1、Oracle ERP/EBS初級顧問和技術顧問; 1、Oracle ERP/EBS用戶熟練學習ERP系統的基本設置功能; 2、Oracle ERP/EBS財務初級顧問的學習; 3、其他對Oracle ERP/EBS有興趣的想轉行如…

微軟宣布正式開源 Azure IoT Edge 邊緣計算服務

開發四年只會寫業務代碼,分布式高并發都不會還做程序員? 微軟宣布,去年年底公開預覽的 Azure IoT Edge 邊緣計算服務已進入官方版,并通過 GitHub 將其開源。Azure IoT Edge 主要將基于云的分析和定制的業務邏輯轉移到邊緣設備&a…

Windows下安裝BeautifulSoup

電腦首先要安裝好了python,我安裝的是2.7。 下面就是bs4的安裝過程了: 1.去官網下載BeautifulSoup4 2017.02.10目前最新版本:Beautiful Soup 4.3.2 2.解壓文件 將下載得到的壓縮包解壓到任意文件夾,路徑不含中文 3.打開cmd命令提示符 winr&am…

BZOJ1578: [Usaco2009 Feb]Stock Market 股票市場

S<50只股票D<10天的價格給出&#xff0c;求第一天開始用n<200000元最后能得到的最大錢數&#xff0c;保證答案<500000。 做D次完全背包即可&#xff0c;每次做完把dp數組清空。 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #i…

OC如何跳到系統設置里的各種設置界面

當 iOS系統版本 < iOS7時 , 只能跳轉到 系統設置頁面 &#xff0c;樓主試了下&#xff0c;非真機是沒有任何效果的 當iOS系統版本 < iOS 10.0 時 NSURL *url [NSURL URLWithString:"prefs:rootLOCATION_SERVICES"]; if( [[UIApplication sharedApplication]can…

oracle 注冊程序,oracle 靜態注冊

1. 最近在裝ASMDATAGUARD&#xff0c; 在靜態注冊上面吃了大虧&#xff0c;現總結如下2. 在Asm環境中&#xff0c;listener監聽器在grid用戶下DGLSN (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST asm)(PORT 1521))))SID_LIST_DGLSN (SID_LIST (SID_DESC (…

Linux下find用法總結

find:實時查找工具&#xff0c;通過遍歷指定起始路徑下的文件系統層級結構完成文件查找:工作特性:查找速度略慢精確查找實時查找用法:find [option] [查找起始路徑][查找條件][處理動作]查找起始路徑&#xff1a;指定具體搜索目標起始路徑&#xff1b;默認為當前目錄查找條件:指…

虛擬DOM Diff算法解析

React中最神奇的部分莫過于虛擬DOM&#xff0c;以及其高效的Diff算法。這讓我們可以無需擔心性能問題而”毫無顧忌”的隨時“刷新”整個頁面&#xff0c;由虛擬DOM來確保只對界面上真正變化的部分進行實際的DOM操作。React在這一部分已經做到足夠透明&#xff0c;在實際開發中我…

生成ID模板:年月日時分秒+6位自增碼

因為生成訂單ID、商品ID 或者什么什么ID的&#xff0c;不想用自增&#xff0c;又怕反復&#xff0c;于是就用 年與日時分秒 6位自增碼 &#xff08;共計20位長度&#xff09;來當作ID 注意&#xff1a;假設你的ID是Long型。就要注意&#xff0c;Long的最大長度為19位&#xf…

oracle optimizer_features_enable,Oracle Optimizer:遷移到使用基于成本的優化器—–系列2.1-數據庫專欄,ORACLE...

oracle optimizer:遷移到使用基于成本的優化器—–系列2.1系列之二包含影響優化器選擇執行計劃的初始化參數和oracle內部隱藏參數&#xff0c;合理設置這些參數對于優化器是相當重要的。6.影響優化器的初始化參數除了生成統計資料之外&#xff0c;下面提及的參數設置在你的系統…

Azure 跨訂閱遷移資源踩坑記

突然收到微軟的郵件&#xff0c;提示我的一個 Azure 訂閱已經到期&#xff0c;所以轉為“禁用”狀態&#xff0c;只能進行數據的導出和處理。在這個訂閱里有不少較重要的資源在跑&#xff0c;直接關了可不行…于是開啟了一個支持事件&#xff0c;臺灣美眉的態度和聲線真的沒話說…

階乘的精確性

/* 輸入不超過1000的正整數n&#xff0c;輸出n!1*2*3*……*n的精確結果。 樣例輸入&#xff1a;30 樣例輸出&#xff1a;265252859812191058636308480000000 例如 n3&#xff1b;s6&#xff1b; n4&#xff1b;s24&#xff1b; n5&#xff1b;s120&#xff1b; 1000的階乘需要一…

Optaplanner規劃引擎的工作原理及簡單示例(1)

在之前的文章中&#xff0c;老猿已介紹過APS及規劃的相關內容&#xff0c;也對Optaplanner相關的概念和一些使用示例進行過介紹&#xff0c;接下來的文章中&#xff0c;我會自己做一個規劃小程序 - 一個關于把任務分配到不同的機臺上進行作來的小程序&#xff0c;并在這個小程序…

[HNOI2017]禮物

題目描述 我的室友最近喜歡上了一個可愛的小女生。馬上就要到她的生日了&#xff0c;他決定買一對情侶手環&#xff0c;一個留給自己&#xff0c;一個送給她。每個手環上各有 n 個裝飾物&#xff0c;并且每個裝飾物都有一定的亮度。 但是在她生日的前一天&#xff0c;我的室友突…

《ASP.NET Core 6框架揭秘》實例演示[25]:配置與承載環境的應用

與服務注冊一樣&#xff0c;針對配置的設置同樣可以采用三種不同的編程模式。第一種是利用WebApplicationBuilder的Host屬性返回的IHostBuilder對象&#xff0c;它可以幫助我們設置面向宿主和應用的配置。IWebHostBuilder接口上面同樣提供了一系列用來對配置進行設置的方法&…