日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 数据执行计划,Oracle里常见的执行计划

發(fā)布時間:2023/12/4 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 数据执行计划,Oracle里常见的执行计划 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文介紹了Oracle數(shù)據(jù)庫里常見的執(zhí)行計劃,使用的Oracle數(shù)據(jù)庫版本為11.2.0.1。

1、與表訪問相關(guān)的執(zhí)行計劃

Oracle數(shù)據(jù)庫里與表訪問有關(guān)的兩種方法:全表掃描和ROWID掃描。反映在執(zhí)行計劃上,與全表掃描對應(yīng)的執(zhí)行計劃中的關(guān)鍵字是“TABLE ACCESS FULL”,與ROWID掃描對應(yīng)的執(zhí)行計劃中關(guān)鍵字是“TABLE ACCESS BY USER ROWID”或“TABLE ACCESS BY INDEX ROWID”。

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

2與B*Tree索引相關(guān)的執(zhí)行計劃

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

用實(shí)驗(yàn)查看相關(guān)執(zhí)行計劃

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

現(xiàn)在SQL的執(zhí)行計劃是對索引IDX_EMP_1的索引范圍掃描,關(guān)鍵字是“INDEX RANGE SCAN”。

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

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

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

從上面的輸出可以看出,現(xiàn)在SQL的執(zhí)行計劃走的是對索引IDX_EMP_1的索引快速全掃描,對應(yīng)的是“INDEX FAST FULL SCAN”。

現(xiàn)在加上強(qiáng)制走索引IDX_EMP_1的Hint,再次執(zhí)行該SQL

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

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

3、與表連接相關(guān)的執(zhí)行計劃

Oracle數(shù)據(jù)庫里常見的與表連接相關(guān)的一些方法:排序合并連接、嵌套循環(huán)連接、哈希連接等以及反連接和半連接

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

使用強(qiáng)制走排序合并連接的Hint后再次執(zhí)行SQL

從上面的輸出可以看出現(xiàn)在SQL的執(zhí)行計劃走的是對表T1和T2的排序合并連接,對應(yīng)的關(guān)鍵字是“MERGEJOIN”和“SORT JOIN”。

接著使用強(qiáng)制走嵌套循環(huán)連接的Hint后再次執(zhí)行SQL

從上面的輸出可以看出現(xiàn)在SQL的執(zhí)行計劃走的是對表T1和T2的嵌套循環(huán)連接,對應(yīng)的關(guān)鍵字是“NESTEDLOOPS”

嵌套循環(huán)連接的驅(qū)動表是可以變的,我們使用Hint將上述SQL的驅(qū)動表改為T1再將執(zhí)行SQL

從結(jié)果中可以看到,嵌套循環(huán)連接的驅(qū)動表確實(shí)已經(jīng)變?yōu)門1

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

從輸出內(nèi)容上可以看出,SQL的執(zhí)行計劃走的是對表T1和T2的哈希反連接,反連接在執(zhí)行計劃中對應(yīng)的關(guān)鍵字是“ANTI”,哈希反連接對應(yīng)的就是“HASH JOIN ANTI”。

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

從輸出內(nèi)容可以看出,SQL的執(zhí)行計劃走的是對表T1和T2的排序合并反連接,對應(yīng)的關(guān)鍵字是“MERGE JOIN ANTI”。

再使用Hint將SQL的反連接方法改為嵌套循環(huán)反連接

再看半連接的例子。

從輸出可以看出,SQL的執(zhí)行計劃走的是對表T1和T2的哈希半連接,半連接在執(zhí)行計劃中對應(yīng)的關(guān)鍵字是“SEMI”,哈希半連接在執(zhí)行計劃中對應(yīng)的關(guān)鍵字是“HASH JOIN SEMI”。

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

從輸出內(nèi)容可以看出,SQL的執(zhí)行計劃走的是對表T1和T2的排序合并半連接,對應(yīng)的關(guān)鍵字是“MERGE JOIN SEMI”。

再使用Hint把SQL的半連接方法改為嵌套循環(huán)半連接:

從輸出內(nèi)容可以看出,SQL的執(zhí)行計劃走的是對表T1和T2的嵌套循環(huán)半連接,對應(yīng)的關(guān)鍵字是“NESTED LOOPS SEMI”

4、關(guān)于位圖索引相關(guān)的執(zhí)行計劃

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

Oracle在使用完位圖索引后通常會將最后的位圖運(yùn)算結(jié)果轉(zhuǎn)化為ROWID,這一步轉(zhuǎn)換過程對應(yīng)的執(zhí)行計劃中的“BITMAP CONVERSION TO ROWIDS”。

從上面的輸出內(nèi)容可以看出,SQL的執(zhí)行計劃走的是對位圖索引IDX_B_REGION的位圖索引單鍵值掃描,對就的關(guān)鍵字是“BITMAP INDEX SINGLE VALUE”。

把SQL改寫為范圍查詢后再次執(zhí)行

從輸出內(nèi)容可以看出SQL走的執(zhí)行計劃是對位圖索引IDX_B_REGION的位圖索引范圍掃描,對應(yīng)的關(guān)鍵字是“BITMAP INDEX RANGE SCAN”。

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

從輸出可以看出SQL走的執(zhí)行計劃是對位圖索引IDX_B_REGION的位圖索引快速全掃描,對應(yīng)的關(guān)鍵字是“BIT INDEX FAST FULL SCAN”。

執(zhí)行如下SQL:

從輸出內(nèi)容可以看出SQL走的執(zhí)行計劃中,用到了位圖按位與操作,對應(yīng)的關(guān)鍵字是“BITMAP AND”和位圖按位或操作,對應(yīng)的關(guān)鍵字是“BITMAP OR”。

再構(gòu)造位圖按位減的執(zhí)行計劃,SQL如下:

從輸出的執(zhí)行計劃中,位圖按位減的執(zhí)行計劃對應(yīng)的關(guān)鍵字是“BITMAP MINUX”。

總結(jié)

以上是生活随笔為你收集整理的oracle 数据执行计划,Oracle里常见的执行计划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。