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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle强制执行计划,OBA技能2-Oracle执行计划顺序表连接

發布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle强制执行计划,OBA技能2-Oracle执行计划顺序表连接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

小仙我在學習索引執行行為的時候,有個疑惑?那就是索引是找到一個值就馬上回表,然后再找下一個值,再回表。

比如索引唯一掃描,索引范圍掃描,索引全掃描,索引快速掃描。好像都是要回表。尤其是范圍,不范圍完后,再回表呢?像下面的索引范圍掃描

它不是把INDEX RANGE SCAN 執行完了后 再執行TABLE ACCESS BY INDEX ROWID。而是SCAN 一次,TABLE一次。這樣要反復執行好多次,具體多少次,就看評估值Cardinatily 也就是ROW值。

而表連接是,是結果集的鏈接,換言之就是先把表要的數據找出來后,再跟后面的表關聯。

那什么時候是一次一條數據,什么時候是一次全部數據呢?

這要看兩個方面,

1 是操作方法;

2 是表連接方式;

所謂操作方法 就是上面說的過程。比如說INDEX RANGE SCAN 就是一次返回一條數據,然后執行第二方法,回表找具體數據。有的方法 TABLE ACCESS FULL 全表掃描 它就是一次返回全部符合條件的數據。

表連接方法,常見的有3種分別是

1 NESTED LOOPS

2 HASH JOIN

3 SORT JOIN MERGE JOIN

第一個是嵌套循環關聯,第二個是HASH,第三個SORT 排序。

第一個鏈接 類似于JAVA開發當中的 雙循環

for a (i=1;i++;i<1000)

{

x=y*z;

for b( h=1;h++; h<10)

{

o=x*100;

}

}

先執行X=Y*Z 然后再執行內循環,外循環執行1000次,而內循環要執行10次,外乘以外循環次數 10*1000=10000次。

這圖沒有表現我要說的,我大致畫一下

NESTED LOOPS

TABLE ACCESS BY?INDEX ROWID

INDEX RANGE SCAN

TABLE ACCESS FULL

這樣的執行計劃,NESTED LOOPS 不會等 外循環返回所有數據后去執行內循環 也就是TABLE ACCESS FULL。而是外循環返回1條記錄,就執行一次內循環。而要是外循環是TABLE ACCESS FULL 那就必須等待外循環找完全部數據后才執行內循環。

所以這個NESTED LOOPS 是受到具體執行方法的影響。另外兩種不受影響。

OBA常用術語叫驅動表,它就是指外循環,也就是先被執行的表,一般都是兄長級別的表。另外兩個鏈接也是兄長級別當驅動表。

所以 驅動表 必須是小表,確切地說是返回結果集小的,也就是返回行數最少的。否則向上面的雙循環列子樣,外循環要執行1000次,而內循環執行10次,可內循環被外循環強制執行了1萬次。

你要是說顛倒過來,內循環還是要執行1萬次。可是總體來說是10次+1萬次,而不顛倒過來是1000次+1萬次。多了990次。

另外談個順序,在很多表關聯的SQL中,表與表之間的關聯是單向的,第一個表與第二個表關聯后形成了結果集,保存在PGA的數據。然后再跟第三個表關聯再形成結果集保留在PGA里,接著跟第4個表關聯。

而不是第1個表與第2個表關聯形成結果集1,然后第3個表與第4個表關聯形成結果集2,最后結果集1和結果集2關聯。執行計劃不能被并行執行。

NESTED LOOPS 是兩個表等值關聯,返回少量數據;

HASH JOIN?是兩個表等值關聯,返回大量數據;

HASH JOIN 會選擇返回數據較少的表,把表的SELECT列和JOIN列放入PGA中,然后對另外個表的JOIN列進行HASH取值,然后再跟PGA的驅動表JOIN列進行匹配關聯。

SORT MEGER JOIN 處理兩個表非等值關聯 >,>=,.

先對兩個表根據JOIN列進行排序,選擇數據較小的表作為驅動表,然后跟排好序的另外個表進行匹配。驅動表返回多少行,另外個表就要匹配多少次。

SELECT STATEMENT

MERGE JOIN

TABLE ACCESS BY?INDEX ROWID

INDEX RANGE SCAN

SORT JOIN

TABLE ACCESS FULL

并且兩個表的數據都要放進內存PGA進行匹配,如果內存放不下,就放到磁盤上。

所以這里全部數據提到內存進行匹配, 不受INDEX RANGE SCAN 單行的影響。

CARTESIAN JOIN 笛卡爾 ,這是兩個表沒有連接列造成的。

MEGER JOIN CARTESIAN 也是笛卡爾.

SEMI JOIN 叫做半連接 兩個表關聯只返回1個表的數據,一般都是IN和EXISTS。會出現 MERGE JOIN SEMI,NESTEDLOOPS SEMI的執行方法。都屬于半連接。

ANTI JOIN 是反連接。是NOT IN,NOT EXISTS,執行計劃的方法名字帶有ANTI 就是反連接,表現有 MERGE JOIN ANTI NA;NESTED LOOPS ANTI

FILTER 連接 FILTER這個字眼在執行計劃有兩個意思,1個就是過濾,另外一個是關聯,類似于NESTED LOOPS。主要看FILTER下面是否有兩個以上的兒子(后代)。

為啥不直接用NESTED LOOPS 表示呢?因為FILTER告訴你 其中子查詢沒有被展開。

總結

以上是生活随笔為你收集整理的oracle强制执行计划,OBA技能2-Oracle执行计划顺序表连接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。